この記事でわかること
Power Appsで編集フォームを使う際、「一部の列は自動で入れたいから非表示にしたい」という場面があります。しかし、SubmitFormは表示しているDataCardしか送信できないという制約があるため、非表示にした列はそのままでは保存されません。
この記事では以下をまとめます。
- SubmitFormとPatchの役割の違いと使い分け
- LastSubmitの意味と使い方
- DataCard同士が直接参照できない場合のグローバル変数の活用方法
編集フォームの基本設定(DataSource・Item・SubmitFormの基礎)については、こちらの記事で解説しています。
どんな状況で詰まったか
自重トレーニングを記録する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にリネームしています。)

なぜうまくいかなかったのか
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)

Step1:SubmitFormで表示DataCardを送信する
SubmitForm(RecordForm) で、ユーザーが入力した4列(ExerciseName・Reps・TotalSets・BodyweightRatio)をSharePointに送信します。これが「新規レコードの登録」にあたります。
Step2:Patchで非表示列を補完する
SubmitFormで登録したレコードに対して、Patchで残りの列を追記します。補完する列の内容は以下のとおりです。
| 列名 | 設定する値 | 理由 |
|---|---|---|
| Title | Text(Now(), “yyyymmdd-hhmmss”) | 重複しない記録IDを自動生成 |
| WorkoutDate | Today() | 今日の日付をトレーニング日として登録 |
| RecordedAt | Now() | 記録した日時をそのまま保存 |
| BodyWeightKg | gUserProfile.BodyWeightKg | 予めAppのOnStartで設定したSharePointリストのBodyWeightKg列を保存 |
登録が成功すると下図のようになります。

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を触り始めたばかりの方に向けて、こういった詰まりポイントをこれからも発信していきます。よかったらブログをブックマークして、またのぞきに来てください。
あわせて読みたい
この記事の前に読むとスムーズです。ギャラリーの絞り込み機能はこちら。

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



コメント