PowerApps、チェックボックスで選択アイテムに一括処理をする


概要

PowerAppsのギャラリーにて、アイテムにチェックボックスをつけ、チェックをつけたアイテムに対して一括処理を行いたい場合の方法について調べてみました。

方法

チェックをつけたアイテムを一括削除する場合を例にします。
ギャラリーのItemsには以下のようなFoodListコレクションが入ってるとします。
{Id:1, FoodName:"炒飯"},{Id:2, FoodName:"餃子"}
Id列などレコードを特定できる一意のデータが入っていることが前提です。

削除ボタンのOnSelectで以下の関数を入力します。

ForAll(
    Filter(Gallery1.AllItems, Checkbox1.Value = true) As A,
    RemoveIf(FoodList,Id = A.Id)
)

ForAllでギャラリーコントロールのうちチェックが入っているアイテムを一行ずつ参照し、RemoveIfでIdで比較して元のコレクションから削除処理を行います。
ポイントは「As演算子」でギャラリーコントロールのコレクションをAに変換している点です。
ThisRecordを使用してRemoveIf(FoodList,Id = ThisRecord.Id)としてもうまくいきませんでした。
左のIdがThisRecordのId(省略形)かFoodListのIdかが区別できないことが原因のようです。SQLと同じですね。
今後のアップデートで変わるかもしれません。

今回は削除のアクションを行う例ですが、他のアクションにも応用できると思います。

他の方法

他の方法としては、削除用のコレクションを作成しておき、チェックボックスのOnCheckでThisItemを削除リストに追加。
削除ボタンに以下のような関数を入れ、コレクションに対してRemoveIf関数で削除リストと比較して削除する方法です。
先程の方法より少し手間がかかります。

If(IsEmpty(DeleteList),
    Notify("削除するアイテムがありません。",NotificationType.Information),
    RemoveIf(FoodList,ThisRecord in DeleteList);Clear(DeleteList);
)

後は、OnCheckが働かない状況ではこの方法は使えません。
例えば、全てにチェック/解除のようなボタンを用意し、別のコントロールからチェックの状態を制御する場合です。
※PowerAppsでそんな要件ないと思いますが・・