🔢

Power Apps: コレクションにインデックスを付与する(ForAll 無し)

2025/04/01に公開

はじめに

Power Apps コレクションにインデックス(連番)を付与したいシナリオは多いと思います。
ForAll 関数を利用したループ処理にてコレクションの 1 行ずつに連番を付与する方法が多くの技術記事で紹介されていますが、処理件数が多い場合は Power Platform 要求数の過剰な消費やパフォーマンスへの影響が気になります。
ループ処理を行わずにコレクションにインデックスを付与することができないか考えてみました。

前提

SharePoint リスト「data_1000」に登録されたデータがコレクション colData_1000 に保存されているものとします。

事前準備
ClearCollect(colData_1000, data_1000)

解法

コード

任意のボタンの OnSelect など、動作プロパティに以下のように記述します。
結果としては、 colData_1000_Index コレクションの Value 列にインデックスが付与されます。

OnSelect など
ClearCollect(
    colData_1000_Index,
    // 3.結合した列を解除してフラット化
    Ungroup(
        // 2.Index 関数で連番をキーに 1 レコード取得し、テーブル化して列結合
        AddColumns(
            // 1.インデックス付与対象のコレクションの行数分の連番を生成
            Sequence(
                CountRows(colData_1000),
                1,
                1
            ),
            columndummy,
            [
                Index(
                    colData_1000,
                    ThisRecord.Value
                )
            ]
        ),
        columndummy
    )
);

解説

コメントに記載の通りです。

  1. インデックス付与対象のコレクションの行数分の連番を生成
  2. Index 関数で連番をキーに 1 レコード取得し、テーブル化して列結合
  3. 結合した列を解除してフラット化

インデックス付与対象のコレクションを基準にインデックス値を結合するのではなく、インデックス値のコレクションを基準に対応するインデックス付与対象のコレクションのレコードを結合するという、逆のアプローチです。
Index 関数は指定したテーブルのインデックスをキーとしてレコードを返しますが、レコードとして結合すると UnGroup 関数を利用してインデックス値と同階層にフラット化できない為、 [] で囲んでテーブルとして結合しています。
これにより、 Ungroup 関数でグループ化を解除することができます。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-sequence
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-first-last
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-groupby

Discussion