Power Appsの使い方:SharePointリストから申請アプリを作る

公開 書いた人 大林 諒

Power Apps のキャンバスアプリは、SharePoint リストを1つ用意すれば、数回のクリックで「一覧を見る・詳細を見る・新しく入力する・直す」ができるアプリが自動でできます。ただ、自動でできたアプリは列が全部並んだだけの画面で、そのままでは現場で使いにくいものです。この記事では、サンプル工務店の休暇申請リストからアプリを作り、自分の申請だけを一覧に出す、入力欄を絞る、期間の重複を確かめる、上長に催促するボタンからフローを呼ぶ、というところまで、手順と式をそのまま書きます。前提は、休暇申請リストが SharePoint にあること(列の作り方は「Teamsの承認アプリとPower Automateの承認フロー:申請から承認までを作る」で書いた形)と、Power Apps が何かをおおまかに知っていることです。何をアプリにするべきかの判断は「Power Appsとは:できることと、入力画面をアプリにする判断」に書いています。

この記事の内容
  1. 先に決めること
  2. 作るものの一覧
  3. リストからアプリを作る
  4. 画面を直す
  5. Power Fxの基本を申請アプリで使う
  6. ボタンからPower Automateのフローを呼ぶ
  7. アプリの共有と、リストのアクセス許可
  8. 委任の警告(500件・2,000件の上限)
  9. できないことと、その代わり
  10. よく詰まるところ
  11. 次にやること

先に決めること

作り始める前に決めておくと、あとで作り直さずに済むことが3つあります。

1つ目は、リストの列を固めておくことです。アプリはリストの列を見て画面を作るので、あとから列を足すとアプリ側でもフォームに足す作業が要ります。列名を変えるとアプリの式が壊れることもあります。リストの列を最初に英数字の名前で作り、表示名を日本語にしておくと、式の中で列を指定するときに困りません。

2つ目は、誰が何を見てよいかです。休暇申請なら、申請者は自分の申請だけ、上長と総務は全員分、が普通です。アプリの画面で「自分の申請だけ」に絞っても、SharePoint リストを直接開けば全員分が見えます。見せたくないなら、アプリではなくリストの側で制限します(後述)。

3つ目は、申請のあとの処理をアプリでやるかフローでやるかです。承認依頼・通知・書き戻しは Power Automate のフローに任せ、アプリは「入力と一覧」に徹するのが、直す人にとって一番分かりやすい分け方です。サンプル工務店では、リストに申請が登録されたら承認フローが動く形(承認の記事で作ったもの)をそのまま使い、アプリはその入口にしています。

作るものの一覧

この記事で作る休暇申請アプリの全体です。

部品やること使う式・機能
一覧自分の申請を新しい順に出す。状態で絞り込むFilter・SortByColumns・User()
入力フォーム休暇の種類・期間・理由だけを入力させるフォームの「フィールドの編集」・SubmitForm
重複の確認同じ期間に申請済みなら警告を出すLookUp
取り下げボタン申請中のものを取り下げにするPatch
催促ボタン上長に Teams で催促を送るPower Automate のフロー
共有全社員に使わせ、総務を共同所有者にするアプリの共有・リストのアクセス許可

リストからアプリを作る

作り方は2通りあり、どちらでも同じアプリができます。

リストから作る

  1. SharePoint で休暇申請リストを開きます(Microsoft Lists の画面に切り替わります)。
  2. 上部の「統合」→「Power Apps」→「アプリの作成」を選びます。
  3. アプリの名前に「休暇申請」と入れて「作成」を選びます。
  4. Power Apps Studio(アプリを作る画面)が開き、リストのデータが入ったアプリが表示されます。
Microsoft Lists で休暇申請リストを開き、「統合」→「Power Apps」→「アプリの作成」のメニューが開いている状態
Microsoft Lists で休暇申請リストを開き、「統合」→「Power Apps」→「アプリの作成」のメニューが開いている状態

Power Appsから作る

  1. make.powerapps.com にサインインします。
  2. ホーム画面で「データで開始」を選びます。
  3. 「アプリの作成」のページで「SharePoint」を選びます。
  4. SharePoint のサイトの URL を入れて「接続」を選びます(最近使ったサイトから選んでもかまいません)。
  5. 「休暇申請」を選び、「アプリの作成」を選びます。

どちらで作っても、最初に「アプリのプレビュー」(右上の再生のアイコン)で動きを確かめます。一覧が出て、項目を選ぶと詳細が見え、新しい申請を入れるとリストにも行が増えることを確かめたら、「保存」しておきます。

自動で作られるアプリの形は、2026年10月時点では、一覧とフォームが1つの画面にまとまった形です。画面の幅に合わせて並びが変わるので、パソコンではタブレットのような横並び、スマホでは縦に並びます。以前は「一覧の画面」「詳細の画面」「編集の画面」の3画面で作られていて、そのころに作ったアプリは3画面のまま動き続けます。社内に古いアプリがある場合は、画面の作りが違うことを覚えておきます。

Power Apps Studio で、自動で作られた休暇申請アプリ。左にツリー ビュー、中央に一覧とフォーム、上に数式バーが見えている状態
Power Apps Studio で、自動で作られた休暇申請アプリ。左にツリー ビュー、中央に一覧とフォーム、上に数式バーが見えている状態

画面を直す

Power Apps Studio の画面は、左に部品の一覧(ツリー ビュー)、中央にアプリ、上に数式バー、右に選んだ部品のプロパティがあります。部品を選んで、数式バーでそのプロパティの式を書き換える、というのが直し方の基本です。

一覧を自分の申請だけにする

一覧の部品(ギャラリー)を選び、数式バーの左で「Items」を選んで、次の式に置き換えます。

SortByColumns(
    Filter('休暇申請', '登録者'.Email = User().Email),
    "Created",
    SortOrder.Descending
)

'登録者' は SharePoint が自動で付ける「誰が登録したか」の列です。User().Email は、名前に反してメールアドレスではなく、アプリを使っている人の UPN(サインインに使う名前)を返します。サインインの名前とメールアドレスが同じ会社なら、これで自分が登録した申請だけが新しい順に並びます。

サインインの名前とメールアドレスが違う会社では、この式だと1件も出ません。その場合は、アプリの「OnStart」で Office 365 ユーザーのコネクタから自分のメールアドレスを取って変数に入れ(例:Set(varMyMail, Office365Users.MyProfileV2().mail))、式の User().Email を varMyMail に置き換えます。自社がどちらかは、自分の Microsoft 365 のサインインの名前とメールアドレスを見比べれば分かります。上長や総務用に全員分を見る画面を別に作る場合は、Filter を外した式にします。

一覧に表示する項目は、ギャラリーの中のラベルを選んで「Text」の式を変えます。開始日と終了日をまとめて1行に出すなら、次のようにします。

Text(ThisItem.開始日, "yyyy/mm/dd") & " 〜 " & Text(ThisItem.終了日, "yyyy/mm/dd")

状態で絞り込むドロップダウンを置く場合は、ドロップダウンの「Items」を ["すべて","申請中","承認","却下","差し戻し"] にし、ギャラリーの式の中の Filter を次のように変えます。

Filter(
    '休暇申請',
    '登録者'.Email = User().Email,
    drpStatus.Selected.Value = "すべて" || 状態.Value = drpStatus.Selected.Value
)

drpStatus はドロップダウンの名前です。ツリー ビューで部品の名前を分かりやすく付け直しておくと、式が読みやすくなります。

フォームの入力欄を絞る

自動で作られたフォームには、リストの列がすべて並びます。承認者・承認日時・承認者コメントのようにフローが書き込む列は、申請者に入力させません。

  1. フォームを選びます。
  2. 右のプロパティで「フィールドの編集」を選びます。
  3. 承認者・承認日時・承認者コメント・状態のフィールドの「…」→「削除」を選びます。
  4. 残したフィールド(タイトル・休暇の種類・開始日・終了日・理由)をドラッグして並べ替えます。
フォームを選び、右の「フィールド」ウィンドウで不要なフィールドを削除し、残りを並べ替えているところ
フォームを選び、右の「フィールド」ウィンドウで不要なフィールドを削除し、残りを並べ替えているところ

タイトルを手で書かせたくない場合は、タイトルのカードを選んで「ロック解除」し、入力欄の「Default」を User().FullName & " " & Text(Today(), "mm/dd") & " 申請" のような式にします。状態はリストの既定値(申請中)で入るので、フォームに出す必要はありません。

保存ボタンをSubmitFormにする

フォームの内容をリストに書き込むのは SubmitForm です。自動で作られたアプリの保存ボタンには最初から入っていますが、成功したときと失敗したときの動きを足しておきます。

保存ボタンの OnSelect:   SubmitForm(frmLeave)
フォームの OnSuccess:    Notify("申請しました。上長に承認依頼が届きます", NotificationType.Success); NewForm(frmLeave)
フォームの OnFailure:    Notify("保存できませんでした:" & frmLeave.Error, NotificationType.Error)

frmLeave はフォームの名前です。新しい申請を SubmitForm で保存すると、フォームはいま保存した申請の編集の状態に切り替わります。続けて次の申請を空の状態から入れられるように、NewForm で新規入力の状態に戻しています。ResetForm は入力を初期値に戻す関数で、空の新規入力には戻らないので、ここでは使いません。SubmitForm はフォームの入力チェック(必須の列が空でないか)もしてくれるので、入力画面がフォームならこちらを使います。

Power Fxの基本を申請アプリで使う

Power Apps の式は Power Fx と呼ばれ、Excel の関数に近い書き方をします。申請アプリでよく使うものを表にします。

関数やること申請アプリでの使いどころ
Filter条件に合う行を全部取り出す自分の申請だけを一覧に出す
LookUp条件に合う最初の1行を取り出す同じ期間の申請がもうないか確かめる
SubmitFormフォームの内容を保存する申請の保存
Patchフォームを使わずに行を作る・直す取り下げボタンで状態だけ変える
User()使っている人の名前・UPN(サインインの名前)を返す自分の申請の絞り込み、タイトルの自動入力
Notify画面の上にお知らせを出す保存できた・できなかったの表示

LookUpで期間の重複を確かめる

同じ期間に申請を二重に出すのを防ぎます。フォームの上にラベルを置き、「Text」に次の式を入れます。

If(
    !IsBlank(
        LookUp(
            '休暇申請',
            '登録者'.Email = User().Email &&
            開始日 <= dpEnd.SelectedDate &&
            終了日 >= dpStart.SelectedDate
        )
    ),
    "この期間には申請済みのものがあります",
    ""
)

dpStart と dpEnd は、フォームの中の開始日と終了日の入力欄の名前です。保存ボタンの「DisplayMode」を、このラベルが空でないときは DisplayMode.Disabled にすれば、重複したまま保存できなくなります。

Patchで取り下げる

申請中の申請を本人が取り下げるボタンは、フォームを使わず Patch で状態の列だけを変えます。一覧のギャラリーの中にボタンを置き、「OnSelect」に次の式を入れます。

Patch(
    '休暇申請',
    ThisItem,
    { 状態: { Value: "取り下げ" } }
);
Notify("取り下げました", NotificationType.Information)

SharePoint の選択肢の列に書き込むときは、{ Value: "取り下げ" } の形で渡します。ただし、この書き方は公式の Patch の説明には載っていません(公式の選択肢の例は Dataverse のもので、SharePoint などでは形式が異なることがある、とだけ書かれています)。実際の運用ではこの形で動いていますが、エラーになる場合は、取り下げもフォームを使って保存する形に変えます。リストの状態の列に「取り下げ」の選択肢を足しておきます。ボタンの「Visible」を ThisItem.状態.Value = "申請中" にしておくと、申請中のものにだけボタンが出ます。

フォームを使わずに新しい行を作るときは、Defaults を使います。

Patch(
    '休暇申請',
    Defaults('休暇申請'),
    {
        Title: User().FullName & " 申請",
        休暇の種類: { Value: "有給" },
        開始日: dpStart.SelectedDate,
        終了日: dpEnd.SelectedDate
    }
)

SubmitForm と Patch の使い分けは、入力欄がフォームなら SubmitForm、ボタン1つで決まった値を書き込むなら Patch です。Patch は入力チェックをしてくれないので、空のまま保存されないように自分で条件を書きます。

ボタンからPower Automateのフローを呼ぶ

承認依頼に上長が気づいていないとき、申請者がアプリのボタンから上長に催促を送れるようにします。

フローを作る

  1. Power Apps Studio の左のメニューで「Power Automate」を選びます。
  2. 「新規フローの作成」→「最初から作成」を選びます。
  3. トリガーに Power Apps から呼ばれるトリガー(画面では「Power Apps (V2)」のような名前で出ます)を選び、テキストの入力を1つ足して名前を 申請ID にします。
  4. SharePoint の「項目を取得する」を追加し、休暇申請リストと、「ID」にトリガーの 申請ID を入れます。
  5. 「マネージャーの取得 (V2)」で申請者の上長を取得します(ユーザーに「項目を取得する」の登録者のメールを入れます)。
  6. Teams の「チャットまたはチャネルでメッセージを投稿する」を追加し、「次のように投稿する」でフロー ボットを、「投稿」でボットとのチャットを選び、宛先に上長のメールを入れ、メッセージに申請の内容と「承認をお願いします」と書きます(選択肢と宛先の欄の表示名は画面で確かめます)。
  7. 「保存」を選びます。フローの名前は「休暇申請の催促」にします。
Power Apps Studio の左に Power Automate ウィンドウが開き、「アプリ内」に「休暇申請の催促」フローが追加されている状態
Power Apps Studio の左に Power Automate ウィンドウが開き、「アプリ内」に「休暇申請の催促」フローが追加されている状態

ボタンにつなぐ

一覧のギャラリーの中に「催促」ボタンを置き、「OnSelect」に次の式を入れます。

'休暇申請の催促'.Run(Text(ThisItem.ID));
Notify("上長に催促を送りました", NotificationType.Success)

フローの名前に空白や記号があると式で呼びにくいので、名前は短くしておきます。フローの中身を Power Automate の画面で直したときは、Power Apps Studio の Power Automate ウィンドウでフローの「…」→「更新」を選んでから、アプリを保存・公開し直します。これを忘れると、公開済みのアプリでもフローの実行に失敗することがあります。

フローに渡した値は通信の途中で見える可能性がある、と公式にも書かれています。催促のように ID を渡すだけなら問題ありませんが、フローの中で「渡されたメールアドレスに機密を送る」ような作りはしないでください。宛先はフローの中で取得し直します。

アプリの共有と、リストのアクセス許可

アプリを使ってもらうには、保存して公開したうえで共有します。

  1. Power Apps Studio で「保存」→「公開」を選びます。
  2. make.powerapps.com の左のメニューで「アプリ」を選び、休暇申請アプリを選びます。
  3. コマンド バーの「共有」を選びます。
  4. 共有する相手に、全社員のセキュリティ グループを入れ、権限を「ユーザー」にします。Microsoft 365 グループ(Teams のチームのグループなど)で共有する場合は、そのグループのセキュリティを有効にしておく必要があります。
  5. 総務の事務Bを入れ、権限を「共同所有者」にします。
  6. 「共有」を選びます。
アプリの「共有」ダイアログで、全社のグループが「ユーザー」、事務Bが「共同所有者」になっている状態
アプリの「共有」ダイアログで、全社のグループが「ユーザー」、事務Bが「共同所有者」になっている状態

ここで一番つまずくのが、アプリの共有とリストのアクセス許可が別だという点です。アプリを共有しても、休暇申請リストに書き込む権限がない人は、アプリを開いても一覧が空で、保存もできません。リストのアクセス許可で、同じグループに「編集」の権限を付けておきます。

逆に、リストに「編集」の権限がある人は、アプリを通さずにリストを直接開けます。アプリで自分の申請だけに絞っても、リストを開けば他の人の申請も見えます。これを防ぐには、リストの設定の詳細設定にある「アイテム レベルのアクセス許可」で、読み取りと編集を「自分が作成したアイテムだけ」に絞る方法があります(項目名と選択肢の表記は画面で確かめます)。この設定にすると、全員分を見る必要がある上長や総務には、リストを管理できる強い権限が要る形になります。

アプリを直したときは、毎回「保存」と「公開」の両方が要ります。「保存」だけでは、使っている人の画面は前のままです。

委任の警告(500件・2,000件の上限)

SharePoint リストをデータにしたアプリで、後から必ず出てくるのが委任の問題です。

Power Apps は、Filter などの絞り込みを、できるだけ SharePoint 側に任せます(これを委任といいます)。SharePoint が受け付けない書き方をすると、Power Apps はリストの先頭から500件だけを取ってきて、その中で絞り込みます。リストが500件を超えると、501件目以降は絞り込みの対象にならず、検索しても出てきません。エラーにはならず、黙って結果が欠けるのが怖いところです。

委任できない式を書くと、Power Apps Studio では部品の横に黄色の三角、式に青い波線が出ます。これが委任の警告です。

ギャラリーの横に黄色の三角が出て、数式バーの式の一部に青い波線が引かれている委任の警告
ギャラリーの横に黄色の三角が出て、数式バーの式の一部に青い波線が引かれている委任の警告

SharePoint で委任できるもの・できないものの主なものです。

書き方委任できるか代わりの書き方
Filter で =・<・> を使う(数値・日付)できるそのまま使う
Filter でテキストに =できるそのまま使う
StartsWith(Title, txtSearch.Text)できる前方一致で検索させる
Search 関数SharePoint の公式の委任の表に載っていない(委任されない前提で書く)StartsWith に変える
選択肢の列 状態.Value = "申請中"できるそのまま使う
ユーザーの列の Email と DisplayNameできる他の項目(部署など)では絞り込まない
ID に > や <できない(= だけ可)作成日時の列で絞り込む
IsBlank(列)できない列 = Blank() に変える
CountRows で件数を数えるできない件数は Power Automate や SharePoint のビューで出す
Not を使うできない<> や条件の言い換えで書く

500件という上限は、Power Apps Studio の「設定」→「全般」→「データ行の制限」で最大2,000件まで上げられます。ただ、上げても上限が先に延びるだけで、2,000件を超えれば同じことが起きますし、件数を増やすほどアプリが重くなります。本当の直し方は、委任できる書き方にすることです。

公式に書かれている確かめ方として、テストの間だけ「データ行の制限」を1にする方法があります。委任できていない式は1件しか返さなくなるので、どこが委任できていないかがすぐに分かります。サンプル工務店の休暇申請は年に数百件なので当面は500件に届きませんが、問い合わせ台帳や現場日報のように毎日増えるリストは、半年ほどで500件を超えます。最初から委任できる書き方で作っておきます。

できないことと、その代わり

SharePoint リストと Power Apps の申請アプリは、社内の申請を回すには十分ですが、次のことは苦手です。

  • 数千件を超えるデータの集計。委任できない集計(件数を数えるなど)は正しい数にならないことがあります。集計は Excel や Power BI に任せます。
  • 行ごとに見せる人を細かく分けること。アイテム レベルのアクセス許可は「自分が作ったものだけ」という単純な分け方しかできません。部署ごと、案件ごとに見せる人を変えるなら、Dataverse のセキュリティ ロールや、kintone のように行ごとの権限が最初からある業務アプリの仕組みを検討します。
  • 圏外での入力。キャンバスアプリはネットにつながっている前提で作られています。
  • 複雑な承認経路の画面化。決裁権限表に沿った承認経路を画面とフローで作り込むと、作った人しか直せなくなります。ワークフロー専用のサービスを検討します。

データが増えてきて委任の制限やアクセス許可の分け方で困るようになったら、データの置き場を Dataverse に移すことも考えます。ただし Dataverse を使うアプリは Premium のライセンスが要り、移すのにも手間がかかります。判断は「Dataverseとは:SharePointリスト・Excelとの違いと、使うべき場面」に書いています。

よく詰まるところ

症状原因直し方
共有した人の一覧が空になるリストのアクセス許可がないリストに同じグループで「編集」の権限を付ける
直したのに使う人の画面が変わらない「保存」だけで「公開」していない「公開」を選ぶ。使う人はアプリを開き直す
検索しても古い申請が出てこない委任できない式で、先頭500件しか見ていない委任の警告を消す書き方に直す
黄色の三角が消えないIsBlank など委任できない関数や、SharePoint で委任の対象に載っていない Search を使っているStartsWith や = Blank() に書き換える
選択肢の列に書き込むとエラーになる文字だけを渡している{ Value: "申請中" } の形で渡す(公式に例はないので、動かなければフォームで保存する)
列名を変えたら式が赤くなった式が古い列名を参照している式の列名を直すか、表示名を戻す
ボタンからフローを呼ぶと失敗するフローを直したあとにアプリ側で更新していないPower Automate ウィンドウでフローの「…」→「更新」をして公開し直す
フローの呼び出しで引数の数が合わないと出るフローの入力を足したのにアプリ側が古いフローを更新し、.Run() の引数を入力の数に合わせる
日付が1日ずれて保存される日付の列が「日付と時刻」でタイムゾーンの差が出ているリストの列を「日付のみ」にする
他の人の申請がリストで見えてしまうアプリの絞り込みはリストの権限ではないアイテム レベルのアクセス許可を設定する
自分の申請が1件も出ないUser().Email は UPN を返し、メールアドレスと違う自分のメールアドレスを Office 365 ユーザーのコネクタで取って比べる
古い3画面のアプリと画面の作りが違う今は1画面の形で自動作成されるツリー ビューで部品の名前を確かめてから式を書く

次にやること

休暇申請アプリができたら、同じ作り方で社用車の予約や備品の貸し出しにも広げられます。承認の流れをまだ作っていない場合は承認の記事を、データの置き場で迷い始めたら Dataverse の記事を読んでください。

あわせて読む