PowerAppsに2000件以上のデータを取り込む
Power Appsで2,000件以上のデータを取り込む(SharePointリストを区切って取得する)
Power Appsは、1回の取得で読み込めるデータが「データ行の制限」で決まっていて、既定は500件、設定で最大2,000件まで。SharePointのリストが2,000件を超える場合、そのままでは全件を取得できない。連番の列で2,000件ずつ区切り、繰り返しながらコレクションに集めると、2,000件以上でも全件を取り込める。
事前に必要なもの
| 項目 | 内容 |
|---|---|
| データ行の制限 | 2,000 に変更する |
| SharePointリスト | 数値型の列 subID を追加し、1から連番を入れる(2万件なら1〜20,000) |
| 実行する場所 | ボタンなどの OnSelect(画面の読み込み時に実行する場合は OnVisible) |
手順
ボタンの OnSelect に、下のコードを貼る。SPリスト名称 と コレクション名称 は、自分の名前に書き換える。
Power Apps Studio で、「設定」→「全般」→「データ行の制限」を開き、2000 に変更する。
SharePointリストに、数値型の列 subID を追加し、1から順に連番を入力する。
OnSlectに下記構文を設定する。
// 1回で取得する件数(手順1のデータ行の制限と同じ値にする)
UpdateContext({threshold: 2000});
// リストの最後のレコード(IDが最大のもの)を取得する
UpdateContext({lastRecord: First(Sort(SPリスト名称, ID, SortOrder.Descending))});
// 繰り返す回数(最大のIDを threshold で割って、切り上げる)
UpdateContext({maxIteration: RoundUp(lastRecord.ID / threshold, 0)});
// 取り込み先のコレクションを空にする
Clear(コレクション名称);
// 0, 1, 2, ... と繰り返し、2,000件ずつ取得してコレクションに追加する
ForAll(
Sequence(maxIteration, 0),
With(
{
prev: Value * threshold, // 取得範囲の下限(含まない)
next: (Value + 1) * threshold // 取得範囲の上限(含む)
},
Collect(
コレクション名称,
Filter(
SPリスト名称,
prev < subID && subID <= next
)
)
)
);実行すると、コレクションに全件が入る。
コードの動き
threshold:1回に取得する件数。2,000にする。lastRecordとmaxIteration:IDが最大のレコードを調べて、何回繰り返せばよいかを計算する。IDの最大値が2万なら、20,000 ÷ 2,000 = 10回。Sequence(maxIteration, 0):0〜9の10個の数を作る。この数にthresholdを掛けて、取得する範囲を決める。- 0回目は
0 < subID ≤ 2000、1回目は2000 < subID ≤ 4000、…と、重複も漏れもなく区切られる。 - 各回の
Filterは、1回あたり2,000件以内で収まるので、データ行の制限に引っかからない。
注意点
thresholdは、データ行の制限と同じか、それ以下にする。制限が500のままなら、各回の取得が500件で打ち切られて、取りこぼす。subIDに連番の抜けや重複があると、取りこぼしや二重取り込みの原因になる。SharePointのIDは、削除すると欠番になるため、subIDを別に用意している。- 件数が多いほど、実行に時間がかかる。2万件なら取得が10回走る。また、アプリのメモリも使うので、スマホや古い端末では重くなることがある。
- 【可能性】
subIDを使わず、IDの範囲で区切っても同じ結果になる場合がある。ただし、環境によって挙動が変わるため、実際のリストで確認してから使うこと(【要確認】)。 - 記事の内容は、お使いの環境やバージョンによって、画面の名前や挙動が異なる場合がある。
NOTICES
- 記事内容は実装させたものがほとんどですが自己責任で参考にしてください。