Power Apps Patch関数で既存レコードを更新する|Gallery.Selected・varRecord・入力欄の初期値設定

Patch関数の第2引数を1か所変えるだけで、新規作成から既存レコードの更新に切り替えられます。この仕組みを理解すると、「編集ボタンを押した行だけ更新する」というパターンが自然に作れるようになります。

Gallery.Selectedで更新モードに切り替える

Patch関数の第2引数をDefaultsからGallery.Selectedに変えるだけで、新規作成から既存レコードの更新に切り替わります。

// 新規作成(Defaults = 空の新規レコードの雛形)
Patch(Employees, Defaults(Employees), { Title: "テスト太郎" })

// 既存レコードの更新(Gallery.Selected = 現在選択中のレコード)
Patch(Employees, Gallery1.Selected, { Title: "テスト太郎" })

Gallery1.Selectedはギャラリーで現在選択されているレコードを指します。第2引数をそこに変えるだけで、「今選んでいる行を上書き更新する」ボタンが完成します。新規レコード作成編でDefaultsを使った保存を試した後に、この変化を見るとPatch関数の構造が一気に腹落ちします。

選択状態を視覚化してデバッグしやすくする

Gallery.Selectedが正しく動いているか確かめるには、ギャラリーのTemplateFillプロパティにIsSelectedを使う方法が便利です。選択中のアイテムを色でハイライトします。

// TemplateFill プロパティ
If(
    ThisItem.IsSelected,
    ColorFade(RGBA(74, 144, 226, 1), 80%),
    Transparent
)

ThisItem.IsSelectedは選択中のアイテムがtrueを返します。見た目が変わるだけで「どの行を選んでいるか」が確認できるので、Patchが意図したレコードに当たっているか把握しやすくなります。ギャラリー系の記事で詳しく紹介していますが、更新系アプリを作るときにも必ず役立つテクニックです。

入力欄に現在値を事前表示する

更新フォームでは「現在の値を入力欄に最初から表示してから編集する」UXが基本です。TextInputのDefaultプロパティにGallery.Selected.列名を設定すると、選択中のレコードの値が入力欄に事前表示されます。

// TextInputのDefaultプロパティ
Gallery1.Selected.Title

これを設定しておくと、ユーザーが「今何が入っているか」を見た上で編集できます。全部消してから打ち直す手間がなく、一部だけ変更したいときに特に便利です。

ギャラリーでアイテムをクリックするたびに入力欄の表示が切り替わるため、「どのレコードを編集しているか」がユーザーにも自然に伝わります。ただし、この方法はGallery.Selectedへの依存が強くなるため、複数画面アプリでは次のvarRecord方式に移行することをおすすめします。

Gallery.Selectedの限界

Gallery.Selectedは手軽ですが、使い続けると限界にぶつかります。最も多いのが「新規作成直後の残存問題」です。

Patchで新規レコードを作成した後、ギャラリーの先頭に新しいレコードが表示されます。しかしGallery.Selectedは自動的に新しいレコードを選択してくれません。前に選んでいたレコードのままになるため、この状態でPatchボタンを押すと意図していない別のレコードが上書きされます。

私が最初にアプリを作ったとき、まさにこれで詰まりました。データを更新したはずなのに別の行が変わっていて、しばらく原因がわからなかったです。複数画面にまたがるアプリでは、ギャラリーから離れた瞬間にSelectedが解除されるケースもあります。Gallery.Selectedへの依存はシンプルなアプリには十分ですが、規模が大きくなると不安定さが増します。

varRecordへの移行

Gallery.Selectedの限界を超えるには、varRecordという変数を使う設計に切り替えます。変数の種類(グローバル変数・コンテキスト変数)については変数の使い分けも参考にしてください。

OnSelectでvarRecordに格納する

ギャラリーのOnSelectプロパティに次の1行を追加します。

UpdateContext({varRecord: ThisItem})

ThisItemはクリックされたアイテムのレコードです。これをコンテキスト変数varRecordに格納することで、「どのレコードを選んだか」を画面内で記憶できます。別の画面に遷移する場合はSetを使いグローバル変数にします。

PatchをvarRecordに切り替える

Patch関数の第2引数をGallery1.SelectedからvarRecordに変更します。

Patch(
    Employees,
    varRecord,
    {
        Title: inpTitle.Text,
        Age: Value(inpAge.Text)
    }
)

これでギャラリーの選択状態に依存しなくなります。別の画面に遷移しても、varRecordが「選んだレコード」を記憶しているので正しいレコードを更新できます。入力欄のDefaultも Gallery1.Selected.Title から varRecord.Title に変えると一貫性が保てます。

段階的な習得ロードマップ

Patch関数の習得は次の3段階で進めるのがおすすめです。

最初はDefaultsで新規作成を動かします。ハードコードで固定値を書いてPatchが動くことを確かめます。次にGallery.Selectedで更新を試します。第2引数を1か所変えるだけで更新ができる体験をすると、Patch関数の構造が一気に腹落ちします。最後にvarRecordに切り替えてギャラリーへの依存をゼロにします。複数画面のアプリや安定した動作が求められる場面で本領を発揮します。

最初からvarRecordを使おうとすると、変数の概念とPatch関数の両方を同時に理解する必要があり混乱しやすいです。Gallery.Selectedを経由して段階を踏むことで、何がどう変わったのかが理解しやすくなります。

まとめ

Patch関数の第2引数を切り替えるだけで新規作成・Gallery.Selectedによる更新・varRecordを使った安定した更新へと段階的に移行できます。新規レコード作成編と合わせて読むと、Patchの全体像が整理できます。

次のステップは複数画面にまたがる下書き保存です。varRecordをベースに、statusで提出状態を管理するパターンが必要になります。詳しくは下書き保存の実装パターンで解説しています。

更新パターンを含むPatch関数の全応用パターン——新規作成・下書き保存・SharePoint/Dataverse対応——はPatch関数 応用ガイドに体系化しています。

Patchは使えば使うほど手に馴染む関数です。まずGallery.Selectedで更新を動かして、慣れたらvarRecordへ。焦らず1段階ずつ積み重ねていきましょう。

Xでフォローしよう