Power Appsで絶対覚えたいPatch関数の使い方——フォームなしでデータを保存する方法

Power Appsでデータを保存するには、フォームを使う方法とPatch関数を使う方法の2つがあります。Patch関数を覚えると、フォームに縛られない柔軟なアプリ設計ができるようになります。

Patch関数とは何か

SubmitFormとの違い

Power Apps でデータを保存する方法は大きく2つあります。フォームコントロール(EditForm)を配置して SubmitForm で送信する方法と、Patch関数を直接呼び出す方法です。

SubmitForm はフォームコントロールと画面のレイアウトがセットになっており、標準的な入力画面を素早く作るには便利です。ただし、複数のデータソースに同時に書き込みたいとき、ボタン1つで複数のレコードをまとめて更新したいとき、ポップアップ内や確認ダイアログからのみデータを保存したいとき、といった場面ではフォームコントロールが邪魔になることがあります。そういうときの答えが Patch 関数です。

私が最初に Patch関数の必要性を感じたのは、承認ボタンを押したときにステータスと承認者と承認日時の3列を一気に更新したかったときでした。フォームを使うと余計なフィールドが全部並んでしまう。Patch なら必要な列だけを書き込めるので、UI の自由度が大きく上がります。

それ以降も、基本的にアプリ作成時はSubmitFormよりもPatchを使うことが自然になりました。

Patch関数の基本構文

Patch の基本的な書き方はシンプルです。

Patch(データソース, 対象レコードまたはDefaults(データソース), {列名1: 値1, 列名2: 値2, ...})

引数は3つです。最初がどのデータソース(SharePointリストなど)に書き込むか。次が新規作成か更新かを決めるレコードの指定。最後が実際に書き込む列と値のセットです。

新規レコードを作成する

Defaultsを使った新規作成

新しいレコードを作るときは、2番目の引数に Defaults 関数を使います。Defaults はデータソースの初期状態(空白レコード)を返す関数です。簡単にいえば、新しい行を追加するときのひな型を用意してくれると思えばいいです。

Patch(
    申請リスト,
    Defaults(申請リスト),
    {
        タイトル: テキスト入力_タイトル.Text,
        申請者: User().DisplayName,
        申請日: Today(),
        ステータス: "申請中"
    }
)

このコードをボタンの OnSelect に書くだけで、SharePointリストに新しいレコードが追加されます。フォームコントロールは一切不要です。User() 関数でログインユーザーの名前を自動入力したり、Today() で今日の日付を入れたりと、入力を省力化する書き方も自由に組み合わせられます。

保存後の処理を組み合わせる

Patch の後に続けて処理を書く場合は、セミコロンで区切ります。保存した後でフォームをリセットしたり、別の画面に遷移したりする場合は以下のように書きます。

Patch(
    申請リスト,
    Defaults(申請リスト),
    {
        タイトル: テキスト入力_タイトル.Text,
        申請者: User().DisplayName,
        申請日: Today(),
        ステータス: "申請中"
    }
);
Reset(テキスト入力_タイトル);
Navigate(ホーム画面, ScreenTransition.None)

Patch で保存、Reset でテキスト入力欄を空に戻し、Navigate で画面遷移という3ステップをボタン1つに集約できます。この書き方ができるようになると、アプリ設計の幅がぐっと広がります。

既存レコードを更新する

ThisItemとの組み合わせ

ギャラリーやフォームの中で既存レコードを更新するときは、2番目の引数に ThisItem を使います。ThisItem はギャラリーの現在の行を指します。

// ギャラリー内のボタンの OnSelect に書く例
Patch(
    申請リスト,
    ThisItem,
    {
        ステータス: "承認済み",
        承認者: User().DisplayName,
        承認日: Today()
    }
)

この書き方をすると、ギャラリーで選択している行のステータス・承認者・承認日の3列だけを書き換えます。他の列(タイトルや申請者など)はそのまま維持されます。これが Patch の便利なところで、指定した列だけを選択的に更新できる点が大きな強みです。

LookUpで対象レコードを特定する

ギャラリーの外から特定のレコードを更新したい場合は、LookUp関数で対象を特定します。LookUp は条件に一致する単一のレコードを返す関数です。

Patch(
    申請リスト,
    LookUp(申請リスト, ID = SelectedID),
    {ステータス: "却下"}
)

SelectedID に更新したいレコードの ID が入っている前提です。LookUp が該当レコードを見つけて Patch に渡し、そのレコードのステータスだけを更新します。画面をまたいだ処理や、グローバル変数に保持している選択レコードを後から更新する場面でよく使います。

複数レコードをまとめて更新する

ForAllとPatchの組み合わせ

複数のレコードを一括更新したい場合は、ForAll 関数と組み合わせます。ForAll はテーブルの各行に対して処理を繰り返す関数です。

// コレクション内の全件をSharePointに一括保存
ForAll(
    colDraft,
    Patch(
        申請リスト,
        Defaults(申請リスト),
        {
            タイトル: タイトル,
            申請者: 申請者,
            ステータス: "申請中"
        }
    )
)

colDraft というコレクションに溜めておいたデータを、ボタン1つで一括保存するパターンです。入力画面でどんどんコレクションに追加していき、最後に一括でSharePointに書き込む設計が、スキャン系・日報系アプリではよく使われます。

ただし、ForAll の中で Patch を呼ぶと件数が多いときに時間がかかります。体感でも10件を超えると待ち時間が気になります。大量件数の一括保存が必要な場合は、Power Automate のフローに処理を渡す設計を検討しましょう。

Patch関数を使うときの注意点

列名はSharePointの内部名に注意

SharePointリストを使う場合、Patch に渡す列名は SharePoint の表示名と内部名が一致していることが多いですが、日本語の列名で作ったリストの内部名が英数字になっているケースがあります。特にリスト作成後に列名を変更した場合、内部名は変わらないので注意が必要です。

Power Appsのデータソースペインで列をクリックすると内部名が確認できます。Patch でエラーが出るときは、まず列名のズレを疑ってみてください。

必須列が欠けているとエラーになる

SharePointリストで必須列(Required)の設定がある場合、Patch でそれらの列を省略するとエラーになります。新規作成のときは必須列をすべて含めるよう注意しましょう。Defaults を使っていても必須列の値が入っていなければ保存できません。

エラーが発生したかどうかは Errors 関数で確認できます。

If(
    IsEmpty(Errors(申請リスト)),
    Notify("保存しました", NotificationType.Success),
    Notify("エラーが発生しました: " & First(Errors(申請リスト)).Message, NotificationType.Error)
)

Patch の直後にこの分岐を書いておくと、保存成功と失敗をユーザーに通知できます。現場アプリでは必ず入れておきたい処理です。

SubmitFormを使うべきシーンも残っている

Patch関数を覚えると何でも Patch で書きたくなりますが、標準的な入力フォームを素早く作りたいときは SubmitForm のほうがシンプルに済みます。入力・編集・表示の3モードを自動で切り替えてくれる EditForm コントロールはよくできていて、バリデーション(入力チェック)もある程度自動でやってくれます。

Patch と SubmitForm の使い分けをまとめると以下のようになります。

シーンおすすめ
標準的な入力フォームを素早く作るSubmitForm(EditForm)
特定の列だけを更新するPatch
複数データソースに同時に書き込むPatch
ボタン1つでまとめて保存するPatch
コレクション経由で一括登録するPatch(ForAll と組み合わせ)

Power Appsの変数の使い方についてはグローバル変数とコンテキスト変数の記事も合わせて読んでみてください。Patch で保存する前後の状態管理に変数はよく使います。また、データの取得には Filter や LookUp 関数が必要になるので、Power Appsとは?完全ガイドも参考にどうぞ。

まとめ

Patch関数の基本は「どこに(データソース)」「何を(Defaults か既存レコード)」「どんな値で(列と値のセット)」の3点セットです。これを押さえれば、フォームに縛られない自由な設計ができるようになります。

最初は Defaults との組み合わせで新規作成から始めて、慣れてきたら ThisItem や LookUp を使った更新に挑戦してみてください。Patch が使えるようになると、Power Apps でできることの幅が体感でわかります。楽しみながら試してみましょう。

Xでフォローしよう