【Power Apps】SubmitFormとPatchの使い分け|非表示DataCardはPatchで補完

SubmitFormとPatchの処理フローを図解したアイキャッチ画像 Power Apps

この記事でわかること

Power Appsで編集フォームを使う際、「一部の列は自動で入れたいから非表示にしたい」という場面があります。しかし、SubmitFormは表示しているDataCardしか送信できないという制約があるため、非表示にした列はそのままでは保存されません。

この記事では以下をまとめます。

  • SubmitFormとPatchの役割の違いと使い分け
  • LastSubmitの意味と使い方
  • DataCard同士が直接参照できない場合のグローバル変数の活用方法

編集フォームの基本設定(DataSource・Item・SubmitFormの基礎)については、こちらの記事で解説しています。

👉 【Power Apps】編集フォームの基本設定と編集・保存・新規作成の実装方法

どんな状況で詰まったか

自重トレーニングを記録するPower Appsアプリ「Torelog」を作っていました。
仕様としては、ユーザーが入力する項目は4つだけを考えています。

  • 種目名(ExerciseName)
  • 1セットの回数(Reps)
  • セット数(TotalSets)
  • 負荷割合(BodyweightRatio)

ただし、SharePointのWorkoutLogリストには他にも保存したい列があります。

  • 記録ID(Title):Text(Now(), “yyyymmdd-hhmmss”) で自動生成
  • トレーニング日(WorkoutDate):Today() を自動入力
  • 記録日時(RecordedAt):Now() を自動入力
  • 体重(BodyWeightKg):UserProfileリストから自動取得

これらの項目はユーザーの入力を不要にするためにDataCardを非表示にして、アプリ側で値を入れる設計にしました。ところが、記録ボタンを押してもこれらの列がSharePointに保存されないという問題が起きました。(ここでは、EditFormをRecordFormにリネームしています。)

記録画面のRecordFormとDataCardで表示している項目の一覧

なぜうまくいかなかったのか

SubmitFormが送れるのは「表示しているDataCard」だけ

原因は、SubmitFormの仕様にありました。
SubmitFormは「表示されているフィールドのDataCard」の値しか送信できません。

今回の設計だとSubmitForm(RecordForm)だけを呼ぶと、Title・WorkoutDate・RecordedAt・BodyWeightKgの4列が保存されない状態になっています。

SubmitForm+Patchで非表示列を補完する実装

解決策は、SubmitFormで表示列を送信したあと、Patchで非表示列を補完するという2段構えの実装です。

記録ボタン(RecordButton)のOnSelectに書くコードの全体像はこちらです。

//表示しているDataCardをSubmitFormで送る
SubmitForm(RecordForm);

//Patchで非表示列を補完する
Patch(
    WorkoutLog,
    RecordForm.LastSubmit,
    {
        Title: Text(Now(), "yyyymmdd-hhmmss"),
        WorkoutDate: Today(),
        RecordedAt: Now(),
        BodyweightKg: gUserProfile.BodyWeightKg
    }
);

//フォームをリセットする
ResetForm(RecordForm)
記録ボタン(RecordButton)のOnSelectプロパティにコードを入れている画面

Step1:SubmitFormで表示DataCardを送信する

SubmitForm(RecordForm) で、ユーザーが入力した4列(ExerciseName・Reps・TotalSets・BodyweightRatio)をSharePointに送信します。これが「新規レコードの登録」にあたります。

Step2:Patchで非表示列を補完する

SubmitFormで登録したレコードに対して、Patchで残りの列を追記します。補完する列の内容は以下のとおりです。

列名設定する値理由
TitleText(Now(), “yyyymmdd-hhmmss”)重複しない記録IDを自動生成
WorkoutDateToday()今日の日付をトレーニング日として登録
RecordedAtNow()記録した日時をそのまま保存
BodyWeightKggUserProfile.BodyWeightKg予めAppのOnStartで設定したSharePointリストのBodyWeightKg列を保存

登録が成功すると下図のようになります。

SharePointのWorkoutLogリストに全列のデータが入っている画面

Step3:フォームをリセットする

ResetForm(RecordForm) でフォームを空の状態に戻します。次の記録がすぐ入力できる状態になります。

補足:LastSubmitとは何か

Step2のPatchの第2引数にRecordForm.LastSubmitと書いています。
RecordForm.LastSubmitは、SubmitFormで直前に保存されたレコードを指すプロパティです。

PatchはSharePointに「どのレコードを更新するか」を指定する必要があります。新規追加した直後のレコードはIDが自動採番されるため、事前にIDがわかりません。LastSubmitを使うことで、「SubmitFormで今保存したレコードに追記する」という指定ができます。

そのため、SubmitFormより前にPatchを書いてはいけません。

SubmitFormより前にPatchを書くと、LastSubmitがまだ空の状態なのでPatchが正しく動きません。必ず「SubmitForm → Patch → ResetForm」の順番で書いてください。

まとめ

この記事では、EditFormのSubmitFormとPatchの使い分け、LastSubmitの役割を解説しました。

今回のポイント

  • SubmitFormは「表示しているDataCard」しか送信できない
  • 非表示列はPatch+RecordForm.LastSubmitで補完する
  • 順番は「SubmitForm → Patch → ResetForm」で固定

Power Platformを触り始めたばかりの方に向けて、こういった詰まりポイントをこれからも発信していきます。よかったらブログをブックマークして、またのぞきに来てください。

あわせて読みたい

この記事の前に読むとスムーズです。ギャラリーの絞り込み機能はこちら。

【Power Apps】ギャラリー絞り込み機能の実装|フィルターとコレクション
Power Appsのギャラリーに期間・種目フィルターとソート切り替え・件数表示を実装する方法を解説。Switch+FilterやClearCollectを使った実装手順をステップごとにまとめています。

次のステップはこちら。後から直しやすいアプリの設計です。

【Power Apps】後から直しやすいアプリの設計|命名規則・カラーテーマ管理・バリデーション
Power Appsで後から直しやすいアプリを作るための設計のコツを4つ紹介。コントロールの命名・gThemeによるカラー管理・ボタンの状態別色設定・バリデーションの実装まで、コピペできるコードつきで解説します。

コメント

タイトルとURLをコピーしました