Powerappsのコレクションを編集用のギャラリーから更新する方法
動画配信も始めたのでぜひそちらもチェックしてみてください。
(Powerapps関連ではないですが、15年間磨き続けた超時短パソコンテク動画です。)
- 作成:Patch
- 更新:Patch、Updateif
- 一括更新:Patch
- 削除:Remove
- 一括削除:Clear
色々やり方はあるのですが、特に一括(for allで更新するところ)が結構はまってしまったので備忘録として記事にしました。
今回テスト用に作ったのは以下のアプリ

- コレクションを編集するためのギャラリー
- コレクションを参照するためのテーブル
- 編集用のギャラリーに空白レコードを挿入するアイコン(Patchでコレクションにからレコードを作成しています。)
- コレクションを削除するアイコン
- ギャラリーでの編集を一括で更新するボタン(Patchバージョン)
- ギャラリーでの編集を一括で更新するボタン(updateifバージョン)
- ギャラリーで選択されている行を削除するアイコン
- ギャラリーで選択されている行のみ更新するアイコン(Patchバージョン)
- ギャラリーで選択されている行のみ更新するアイコン(Updateifバージョン)
③編集用のギャラリーに空白レコードを挿入

Set(
Index,
Index + 1
);
Collect(
datacollection,
{
Index: Index,
ischosen: false,
name: "",
phone: "",
comments: ""
}
)
これはPatchではなくて単純にCollect関数で新規レコードをコレクションに追加しています。
レコード挿入時にIndex番号をインクリメントしてレコードに割り当てています。
一意の値がコレクションになければ更新、削除等するときにどのレコードが対象かの条件文が書けないのでこういう実装にしています。
④コレクションを削除する

Clear(datacollection);
Set(
Index,
0
);
Set(
Index,
Index + 1
);
Collect(
datacollection,
{
Index: Index,
ischosen: false,
name: "",
phone: "",
comments: ""
}
)
Clear関数でコレクションを削除しています。※今回のテーマとは関連しないです。
コレクションをクリアした時点で新規のレコードを1レコード挿入する実装としています。
⑤ギャラリーでの編集を一括で更新するボタン

ForAll(
RenameColumns(
Gallery_for_Edit.AllItems,
"Index",
"tmpIndex"
),
Patch(
datacollection,
LookUp(
datacollection,
Index = tmpIndex
),
{
name: TextInput_name.Text,
phone: TextInput_telephone.Text,
comments: TextInput_comment.Text
}
)
)
これが一番今回でハマったポイントです。
データソース側のカラム名とギャラリー側のカラム名が同じ場合はPatchでうまく処理できません。したがって今回は2~5行目でギャラリー側のカラム名を変更しています。
他にも、別名のカラムを追加したりする方法もあるようですが、うまくいかなくて最終的にRename(リネーム)することでうまくいきました。
⑥ギャラリーでの編集を一括で更新する

ForAll(
RenameColumns(
Gallery_for_Edit.AllItems,
"Index",
"tmpIndex"
),
UpdateIf(
datacollection,
Index = tmpIndex,
{
name: TextInput_name.Text,
phone: TextInput_telephone.Text,
comments: TextInput_comment.Text
}
)
)
これはPatchの代わりにUpdateIf関数を利用した場合です。UpdateIfで書いた方が条件はシンプルに書けますが、PatchでもUpdateIfでもどちらでもいいでしょう。
⑦ギャラリーで選択されている行を削除する

Remove(
datacollection,
First(
Filter(
datacollection,
Index = ThisItem.Index
)
)
)
レコードの削除はRemove関数で実装しています。
これはシンプルなのであまり悩む要素がありませんでした。
⑧ギャラリーで選択されている行のみ更新する

Patch(
datacollection,
ThisItem,
{
name: TextInput_name.Text,
phone: TextInput_telephone.Text,
comments: TextInput_comment.Text
}
);
これはシンプルなのであまり悩む要素がありません。
⑨ギャラリーで選択されている行のみ更新する

UpdateIf(
datacollection,
Index = Gallery_for_Edit.Selected.Index,
{
name: TextInput_name.Text,
phone: TextInput_telephone.Text,
comments: TextInput_comment.Text
}
)
選択した行を1行更新するだけならPatchを使った方がシンプルです。そもそもUpdateifは条件に合致したレコードを一括で更新できる処理なので。今回は練習を兼ねて実施してみました。
3行目の条件を指定しているところがポイントなのですが、Gallery側を”Gallery_for_Edit.Selected.Index”と明示することでできました。