- 記事一覧 >
- ブログ記事
Power Automate & Share Pointの5000件問題を攻略した
はじめに
前回記事「PowerApps SharePoint 委任問題(2000 件問題)をいろいろな方法で攻略した」で Power Apps から 2000 件を超えるデータの処理について書きました。
そこで、Power Automate を使う対処法の説明でとりあえず、5000 件を超えないものとして進めました。複数の項目の取得
の 上から順に取得 の上限が 5000 件だったからです。
今回記事では、5000 件を超えて対処しようと思います。
あわせて、その対処を行っても、ライセンス、トリガーによっては、Apply to each
(それぞれに適用する
)、複数の項目の取得
について、5000 件問題が発生しますので、それについても紹介したいと思います。
前回記事を知らなくてもこの記事単独で成立する内容です。
テストデータ
以下のようにシンプルなものとします。
列名 | 型 |
---|---|
分類 | 一行テキスト(細かい設定はデフォルトのまま) |
テスト値 | 数値(細かい設定はデフォルトのまま) |
分類 | テスト値 |
---|---|
A | 1 |
A | 2 |
... | ... |
A | 1000 |
B | 1001 |
... | ... |
C | 2001 |
... | ... |
D | 3001 |
... | ... |
E | 4001 |
... | ... |
F | 5001 |
... | ... |
F | 5998 |
F | 5999 |
F | 6000 |
今回、6000 件準備します。
テスト値は、1
~6000
まで 1 刻みの連番が入っているものとします。1
~ 1000
までの分類の値は、A
1001
~ 2000
までの分類の値は、B
2001
~ 3000
までの分類の値は、C
3001
~ 4000
までの分類の値は、D
4001
~ 5000
までの分類の値は、E
5001
~ 6000
までの分類の値は、F
とします。
上から順に取得の上限問題
Power Apps から起動して、
1 ~ 6000 というように、5000 件を超えるデータを取得するフローを作成しました。
前回記事では、2000 件を超えて、3000 件のデータ全てを取得できれば、OK としました。
そのため、複数の項目の取得
の 上から順に取得 のところを 5000
としました。
それが以下のフローです。
上から順に取得 について、5000 を超える値を設定できません。複数の項目の取得
の 上から順に取得 のところを 6000
として、フローを実行すると、以下のエラーになります。この操作は、リストビューのしきい値を超えているため、実行できません。
clientRequestId: 5d8*****-****-****-****-*********c02
serviceRequestId: 5d8*****-****-****-****-*********c02
5000 件を超えて Share Point リストからデータを取得するときは、フローの編集に戻って、複数の項目の取得
の 設定 → 改ページ オン → しきい値=100000
で取得できるようになります。
設定したら、確認してみます。
(length(outputs('複数の項目の取得')?['body/value'])
で確認)
5000 件を超えて、6000 件取得できました。
ちなみに、複数の項目の取得
の 上から順に取得 のところは 5000
としたままです。6000
とすると、やはり、
この操作は、リストビューのしきい値を超えているため、実行できません。
のエラーになります。
さらに、上から順に取得 の設定値を削除して空白にしても同じ結果です。(6000 件取得できます。)複数の項目の取得
の 上から順に取得 のところを 1000
としても同じ結果です。(6000 件取得できます。)
まとめると以下です。
改ページ | しきい値 | 上から順に取得 | 結果 |
---|---|---|---|
オフ | - | 1000 | 1000 件まで取得 |
オフ | - | 5000 | 5000 件まで取得 |
オフ | - | 6000 | エラー |
オン | 100000 | 1000 | 5000 件超取得OK |
オン | 100000 | 5000 | 5000 件超取得OK |
オン | 100000 | 6000 | エラー |
ライセンス、トリガー 5000 件問題
ライセンス、トリガーによっては、Apply to each
(それぞれに適用する
)、複数の項目の取得
についても 5000 件問題が発生します。
ライセンス、トリガーにより、以下のように「パフォーマンス プロファイル」が異なり、「ミディアム」以上の場合、ここで話題にする 5000 件問題は発生しないと思われます。※
パフォーマンス プロファイル | プラン |
---|---|
低 | - 無料 - Microsoft 365 プラン - Power Apps プラン 1、アプリごとのプラン - Power Automate プラン 1 - すべての試用版ライセンス - Dynamics 365 Team Member - 開発者向け Microsoft Power Apps |
ミディアム | - Power Apps トリガー型フロー、手動フロー、子フロー、Power Apps プラン 2、ユーザープランごとの Power Apps - Power Automate プラン 2、Power Automate プレミアム (以前は Power Automate ユーザーごとプラン)、Power Automate プレミアム プラン (以前は Power Automate のアテンド型 RPA のユーザーごとプラン) Dynamics 365 Enterprise プラン、Dynamics 365 Professional プラン - Dynamics 365 の非ライセンス ユーザー、アプリケーション ユーザー、特別な無料ライセンスを持つユーザー |
高 | - Power Automate プロセス プラン (以前は Power Automate フローごとのプラン) |
無制限の拡張 | - 従量課金制フロー、サービス プリンシパル配下で実行されるコンテキスト フローの Dynamics |
(https://learn.microsoft.com/ja-jp/power-automate/limits-and-config
より)
※
以降、パフォーマンス プロファイル=低 のライセンスでのみの検証結果です。上位ライセンスによる違いは確認していません。
ライセンスの確認は、Power Automate トップ画面(https://make.powerautomate.com/environments/*/home)で CTRL + ALT + A キーを押すと、JSON が表示されて、
"isCurrent": true,
のところで、確認できます。
以下の例は、無料プラン(Microsoft Power Automate Free)です。
最初に結論を書きますと、無料プラン(Microsoft Power Automate Free)でも、「ミディアム」以上の条件に含まれる Power Appsトリガー型フロー
、手動フロー
、子フロー
を使用した場合、5000 件問題は発生しませんでした。
「無料プランだからエラーになったのかー。」とあきらめかけている場合、トリガーを変更するか、子フローを使えば、解決するかもしれません。
どちらも考えられない場合、5000 件問題フリーのフロー のセクションのようにフローを工夫すれば回避可能です。
パフォーマンス プロファイル=低 のライセンスでのトリガーによる結果の違いを以下にまとめます。(網羅はしていません。)
パフォーマンス プロファイル=ミディアム の説明にある 手動フロー とは、
フローを手動でトリガーする
のことではなく、インスタント クラウド フロー(起動時に人の操作が介在するフロー)のことのようです。
複数の項目の取得:NG の場合、5000 件を超えて取り出そうとしたとき、フローを保存するときにエラーです。
Apply to each:NG の場合、5000 件を超えてループを実行しようとしたとき、フロー実行時にエラーです。
(エラー内容はこの後のセクションで説明があります。)
コネクト | トリガー | 複数の項目の取得 | Apply to each |
---|---|---|---|
モバイルのフローボタン | フローを手動でトリガーする | OK | OK |
PowerApps | PowerApps | OK | OK |
PowerApps | PowerApps(V2) | OK | OK |
SharePoint | 選択したアイテムの場合 | OK | OK |
SharePoint | 選択したファイルの場合 | OK | OK |
SharePoint | フォルダ―内でファイルが作成または変更されたとき(非推奨) | NG | NG |
OneDrive for Business | ファイルが作成されたとき | NG | NG |
OneDrive for Business | 選択したファイルの場合 | OK | OK |
Microsoft Teams | 作成ボックスから(V2) | OK | OK |
Microsoft Teams | 選択されたメッセージに対して(V2) | OK | OK |
OneDrive | 選択したファイルの場合 | OK | OK |
スケジュール | 繰り返し | NG | NG |
Apply to each エラー確認
Apply to each
(それぞれに適用する
) のエラーを確認します。作成
のところに 7000 件の配列データが直書きされています。
JSON 文字列は、以下のシェルスクリプトで出力したものをコピーペーストしたものです。
#!/bin/bash
start_id=1
end_id=7000
echo "["
for ((i=start_id; i<=end_id; i++)); do
if [ $i -ne $end_id ]; then
echo " {\"ID\": $i, \"aaa\": \"aaa\", \"bbb\": \"bbb\", \"ccc\": \"ccc\"},"
else
echo " {\"ID\": $i, \"aaa\": \"aaa\", \"bbb\": \"bbb\", \"ccc\": \"ccc\"}"
fi
done
echo "]"
配列データをApply to each
(それぞれに適用する
)でループして、一回ずつ、作成
で格納しています。結果、特に何も起きず、意味のないフローです。
トリガーは、フォルダー内にファイルが作成されたとき(非推奨)
フロー作成者のライセンスは、無料プラン(Microsoft Power Automate Free)です。フォルダー内にファイルが作成されたとき(非推奨)
は、Share Point のドキュメントフォルダを指定でき、そこに何か適当なファイルを置いたら、フローが起動します。
フォルダー内にファイルが作成されたとき(非推奨)
は、ファイルの内容、パスなどを取得できるのですが、今回は、利用しません。
ファイルを置いて、フローを起動してみます。
InvalidTemplate. Unable to process template language expressions for action 'Apply_to_each' at line '0' and column '0': 'The number of foreach items limit exceeded for action 'Apply_to_each': maximum '5000' and actual '7000'.'.
というエラーとともにフローの実行に失敗しました。
Apply to each エラー回避
手動フロー
ここで、フォルダー内にファイルが作成されたとき(非推奨)
を削除して、フローを手動でトリガーする
に変更すると、エラーにならず、正常に動作します。
フローからトリガーを削除すると、トリガー選択画面が出てきます。
実行します。
成功しました!
余談ですが、7000 回
作成
を実行しているだけなのですが、実行完了に 20 分くらいかかりました。
Apply to each
(それぞれに適用する
)の設定 コンカレンシー制御をオン:20(同時並行実行ありで、同時実行数 20)に設定すると、約 1 分半でした。
子フロー
対応していないトリガーでも子フローを作成して呼び出せば 5000 件問題を回避できます。
子フローは、ソリューションに作成が必要です。
ソリューションの作成は、ここでは省略します。別記事「Power Automate ワークフロー式関数 parameters, action 関数他 まとめ+環境変数について」「parameters 関数」のところでソリューションを作成していますので、そちらをご確認ください。
ソリューションから +新規 → 自動化 → クラウドフロー → すぐに を選択します。
フローを手動でトリガーする
を選択します。
このとき、別のトリガーを選択してはいけません。子フローは、
フローを手動でトリガーする
にする必要があります。
先ほどと同じように、
手動でフローをトリガーします
↓作成
で 7000 件の配列を手入力
↓Apply to each
(それぞれに適用する
)
と作っていって、最後にPowerApp または Flow に応答する
とします。
Apply to each
(それぞれに適用する
)の設定は、 コンカレンシー制御をオン:20(同時並行実行ありで、同時実行数 20)とします。
最後に
PowerApp または Flow に応答する
は、子フローには必須です。
Microsoft Dataverse コネクタ以外を使用している場合、
実行のみのユーザー → 編集 で この接続 (<接続名>)を使用する にしないといけませんが、このフローは、コネクタを一切使用していないため、行いません。
子フローを呼び出す親フローを作成します。
このとき、トリガーは、先ほどエラーを確認したフォルダー内にファイルが作成されたとき(非推奨)
を選択します。
子フローの実行
アクションを追加して、先ほど作成したフローを選択します。
親フローの構成は、以下の通りです。
実行します。
成功しました!
複数の項目の取得 エラー確認
複数の項目の取得
のエラーを確認します。
トリガーは、フォルダー内にファイルが作成されたとき(非推奨)
フロー作成者のライセンスは、無料プラン(Microsoft Power Automate Free)です。複数の項目の取得
の 設定 → 改ページ オン → しきい値=100000
として、フローを作成します。
フローを保存します。
フローの保存がコード 'InvalidPaginationPolicy' およびメッセージ 'The pagination policy of workflow run action '複数の項目の取得' of type 'OpenApiConnection' at line '1' and column '1391' is not valid. The value specified for property 'minimumItemsCount' exceeds the maximum allowed. Actual: '100000'. Maximum: '5000'.' で失敗しました。
というエラーとともにフローの保存に失敗しました。
起動ではなく、保存の時にエラーになります。保存の時にエラーになった場合、保存できず、起動もできません。
複数の項目の取得 エラー回避
手動フロー
ここで、フォルダー内にファイルが作成されたとき(非推奨)
を削除して、フローを手動でトリガーする
に変更すると、エラーにならず、正常に保存でき、動作します。
状況が分かりにくいため、
複数の項目の取得
で取得できた件数を作成
で表示するようにしています。
保存して、実行します。
成功しました!
子フロー
対応していないトリガーでも子フローを作成して呼び出せば 5000 件問題を回避できます。
子フローは、ソリューションに作成が必要です。
ソリューションから +新規 → 自動化 → クラウドフロー → すぐに を選択します。フローを手動でトリガーする
↓複数の項目の取得
設定 → 改ページ オン → しきい値=100000
↓PowerApp または Flow に応答する
のフローとします。
なお、今回は、取得件数を返すようにします。
今回は、Share Point 接続があるため、フローの情報画面から、実行のみのユーザー → 編集 をクリックします。
実行専用のユーザーによって提供されました
から この接続 (<接続名>) を使用する
に変更し、保存します。
この操作を行わない場合、親フローから呼び出して、保存したときに以下のエラーになり、保存できなくなります。
XRM API に対する要求が失敗しました。エラー: 'Message: Flow client error returned with status code "BadRequest" and details "{"error":{"code":"ChildFlowUnsupportedForInvokerConnections","message":"ID '2b******-****-****-****-**********e1'、名前 koflow2 のワークフローは、子ワークフローとして使用できません。子ワークフローでは、埋め込み接続のみがサポートされています。"}}". Code: 0x80060467 InnerError: '。
子フローを呼び出す親フローを作成します。
このとき、トリガーは、先ほどエラーを確認したフォルダー内にファイルが作成されたとき(非推奨)
を選択します。
子フローの実行
アクションを追加して、先ほど作成したフローを選択します。
親フローの構成は、以下の通りです。
実行します。
成功しました!
5000 件問題フリーのフロー
1. 複数の項目の取得
の 上から順に取得の上限問題
2. ライセンス、トリガーによる Apply to each
(それぞれに適用する
)、複数の項目の取得
についての 5000 件問題
いずれの場合でも 5000 件問題 から逃れられるフローを作成しました。
2の方は、今回の検証フローの場合、トリガーが
PowerApps
のため、元から発生しません。
「PowerApps SharePoint 委任問題(2000 件問題)をいろいろな方法で攻略した」で作成したフローの 5000 件越え対応版になります。
Power Apps 側の実装は、こちらの記事を確認してください。
データを 13000 件に増強して、全データ取得するフローを作成します。
上から順に取得 5000 を維持しつつ、Do until
を使って、抽出起点の ID を 5000 ずつずらしていくアイデアです。
ここでは、Power Apps で起動して、Power Apps のギャラリーに表示させて確認します。
少し複雑ですが、ざっくりと書くと以下のようなフローです。
PowerApps
トリガーで起動
↓変数を初期化する
で変数初期化
↓Do until
で LoopEnd
が true
になるまでループ
↓複数の項目の取得
で ID が varID
よりも大きいレコードを 5000 件取得 ※1
↓作成
で returnValue
と 5000 件取得結果をマージ ※2
↓作成
の結果を returnValue
に設定 ※2
↓複数の項目の取得
の結果が空かどうか?
↓
はい:LoopEnd
を true
にして、Do until
を抜ける
いいえ:varID
を取得済み最後の ID に変更 →Do until
の最初へ ※1
↓returnValue
を JSON 文字列に変換 ※3
↓PowerApp または Flow に応答する
で応答 ※3
※1
varID
は、初期値 0 で読み取り起点のような役割をします。フィルター クエリは、
ID gt @{variables('varID')}
で gt は、>
の意味になります。
※2
returnValue
は、それまでの結果全てです。直線の結果と一旦作成
でマージしています。マージしている理由は、直接変数の設定
に入れられないからです。returnValue = returnValue + 1
のようなことができないということです。
※3
変数を初期化する
で種類を 文字列 としつつ、値にオブジェクトや配列を指定すると、JSON 文字列が格納されます。
PowerApp または Flow に応答する
で Power Apps 側に JSON 文字列を返して、Power Apps 側でパースしています。
Do until
のループ回数には制限の設定がありますが、デフォルトの回数 60 のままとします。したがって、5000 × 60 件で 300000 件まで対応します。(300000 件もあると、別の現象が発生しそうですが、未検証です。)
実際のフローは以下です。(縦に長いため、3分割で表示されています。)
動作確認します。
取得完了までの時間はカットしています。
13000 件取得できました!
OK!
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。