Power Apps コレクションにインデックスのフィールドを追加する
以下のようにするとコレクションにインデックスのフィールドを追加することができます。
コレクションにインデックスを追加する
// 大本のコレクション
ClearCollect (colItems,{ID:101},{ID:102},{ID:103},{ID:104},{ID:105});
// インデックスを含めるコレクションを初期化
Clear (colItems_Indexed);
// ForAll() + Collect() でインデックス付きコレクションを作成。
ForAll(
colItems,
Collect(
colItems_Indexed,
// Patch() でレコードを連結。インデックスを追加。
Patch(
Last (FirstN (colItems, CountRows (colItems_Indexed) + 1)),
{ Index : CountRows (colItems_Indexed) + 1 }
)
)
);
という感じでできます。と昔OneNoteにまとめていたんですが、少し前に Sequence() 関数と As 演算子が追加されたことでもっといい感じに書けるようになりました。
新バージョンは以下の通りです。(ForAllの部分のみ)
コレクションにインデックスを追加する:新バージョン
ForAll(
Sequence(CountRows(colItems)) As Index,
Collect(
colItems_Indexed,
Patch(
Last(FirstN(colItems,Index.Value)),
{ Index : Index.Value }
)
)
)
Sequence() 関数について
Sequence() 関数は1始まりの連番の単一列テーブルを生成する関数です。今回の例でいうと[1,2,3,4,5]が生成される感じです。動的に連番テーブルを生成できるので、これを使うとPower Apps でできることの幅が広がると思います。意外と欲しかった関数。
As 演算子について
As 演算子はテーブルに命名する演算子です。今回の例でいうと、Sequence()で生成したものに Index と命名して参照できるようにしています。うまく使ってコードの可読性を向上させたいですね。
Patchによるレコードのマージ
Patch()関数は多くの場合レコードの登録、更新に使用しますが、もう一つ機能を持っていて、レコードのマージを行うことができます。今回はその機能を使っています。
参考URL
Adding an index column to a collection
Formulas: ThisRecord, As, and Sequence
https://powerapps.microsoft.com/en-us/blog/formulas-thisrecord-as-and-sequence/
Patch()関数について
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-patch