1. 記事一覧 >
  2. ブログ記事
Power Automate
category logo

Power Automate & Share Pointの5000件問題を攻略した

(更新) (公開)

はじめに

前回記事「PowerApps SharePoint 委任問題(2000 件問題)をいろいろな方法で攻略した」で Power Apps から 2000 件を超えるデータの処理について書きました。
そこで、Power Automate を使う対処法の説明でとりあえず、5000 件を超えないものとして進めました。
複数の項目の取得 の 上から順に取得 の上限が 5000 件だったからです。
今回記事では、5000 件を超えて対処しようと思います。
あわせて、その対処を行っても、ライセンス、トリガーによっては、Apply to eachそれぞれに適用する)、複数の項目の取得 について、5000 件問題が発生しますので、それについても紹介したいと思います。

前回記事を知らなくてもこの記事単独で成立する内容です。

テストデータ

以下のようにシンプルなものとします。

列名
分類一行テキスト(細かい設定はデフォルトのまま)
テスト値数値(細かい設定はデフォルトのまま)

分類テスト値
A1
A2
......
A1000
B1001
......
C2001
......
D3001
......
E4001
......
F5001
......
F5998
F5999
F6000

今回、6000 件準備します。
テスト値は、16000 まで 1 刻みの連番が入っているものとします。
11000 までの分類の値は、A
10012000 までの分類の値は、B
20013000 までの分類の値は、C
30014000 までの分類の値は、D
40015000 までの分類の値は、E
50016000 までの分類の値は、F
とします。


6000 件データ


上から順に取得の上限問題

Power Apps から起動して、
1 ~ 6000 というように、5000 件を超えるデータを取得するフローを作成しました。
前回記事では、2000 件を超えて、3000 件のデータ全てを取得できれば、OK としました。
そのため、複数の項目の取得 の 上から順に取得 のところを 5000 としました。
それが以下のフローです。

上から順に取得 5000


上から順に取得 について、5000 を超える値を設定できません。
複数の項目の取得 の 上から順に取得 のところを 6000 として、フローを実行すると、以下のエラーになります。
この操作は、リストビューのしきい値を超えているため、実行できません。
clientRequestId: 5d8*****-****-****-****-*********c02
serviceRequestId: 5d8*****-****-****-****-*********c02

上から順に取得 6000


上から順に取得 6000 エラー


5000 件を超えて Share Point リストからデータを取得するときは、フローの編集に戻って、
複数の項目の取得設定改ページ オンしきい値100000
で取得できるようになります。

複数の項目の取得 設定


改ページ オン しきい値 100000


設定したら、確認してみます。


length(outputs('複数の項目の取得')?['body/value']) で確認) 複数の項目の取得 設定後の動作確認


5000 件を超えて、6000 件取得できました。


ちなみに、
複数の項目の取得 の 上から順に取得 のところは 5000 としたままです。
6000 とすると、やはり、
この操作は、リストビューのしきい値を超えているため、実行できません。
のエラーになります。


さらに、上から順に取得 の設定値を削除して空白にしても同じ結果です。(6000 件取得できます。)
複数の項目の取得 の 上から順に取得 のところを 1000 としても同じ結果です。(6000 件取得できます。)


まとめると以下です。

改ページしきい値上から順に取得結果
オフ-10001000 件まで取得
オフ-50005000 件まで取得
オフ-6000エラー
オン10000010005000 件超取得OK
オン10000050005000 件超取得OK
オン1000006000エラー

ライセンス、トリガー 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)です。

CTRL + ALT + A キー

最初に結論を書きますと、無料プラン(Microsoft Power Automate Free)でも、「ミディアム」以上の条件に含まれる Power Appsトリガー型フロー手動フロー子フロー を使用した場合、5000 件問題は発生しませんでした。
「無料プランだからエラーになったのかー。」とあきらめかけている場合、トリガーを変更するか、子フローを使えば、解決するかもしれません。
どちらも考えられない場合、5000 件問題フリーのフロー のセクションのようにフローを工夫すれば回避可能です。


パフォーマンス プロファイル=低 のライセンスでのトリガーによる結果の違いを以下にまとめます。(網羅はしていません。)

パフォーマンス プロファイル=ミディアム の説明にある 手動フロー とは、フローを手動でトリガーする のことではなく、インスタント クラウド フロー(起動時に人の操作が介在するフロー)のことのようです。

複数の項目の取得:NG の場合、5000 件を超えて取り出そうとしたとき、フローを保存するときにエラーです。
Apply to each:NG の場合、5000 件を超えてループを実行しようとしたとき、フロー実行時にエラーです。
(エラー内容はこの後のセクションで説明があります。)

コネクトトリガー複数の項目の取得Apply to each
モバイルのフローボタンフローを手動でトリガーするOKOK
PowerAppsPowerAppsOKOK
PowerAppsPowerApps(V2)OKOK
SharePoint選択したアイテムの場合OKOK
SharePoint選択したファイルの場合OKOK
SharePointフォルダ―内でファイルが作成または変更されたとき(非推奨)NGNG
OneDrive for Businessファイルが作成されたときNGNG
OneDrive for Business選択したファイルの場合OKOK
Microsoft Teams作成ボックスから(V2)OKOK
Microsoft Teams選択されたメッセージに対して(V2)OKOK
OneDrive選択したファイルの場合OKOK
スケジュール繰り返しNGNG

Apply to each エラー確認

Apply to eachそれぞれに適用する) のエラーを確認します。
作成 のところに 7000 件の配列データが直書きされています。

7000 件の配列データ 前半


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それぞれに適用する)でループして、一回ずつ、作成 で格納しています。結果、特に何も起きず、意味のないフローです。

Apply to each エラー確認 フロー


トリガーは、フォルダー内にファイルが作成されたとき(非推奨)
フロー作成者のライセンスは、無料プラン(Microsoft Power Automate Free)です。
フォルダー内にファイルが作成されたとき(非推奨) は、Share Point のドキュメントフォルダを指定でき、そこに何か適当なファイルを置いたら、フローが起動します。

フォルダー内にファイルが作成されたとき(非推奨) は、ファイルの内容、パスなどを取得できるのですが、今回は、利用しません。


ファイルを置いて、フローを起動してみます。

Apply to each エラー確認 フロー 起動結果

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 エラー回避

手動フロー

ここで、フォルダー内にファイルが作成されたとき(非推奨) を削除して、フローを手動でトリガーする に変更すると、エラーにならず、正常に動作します。

フローからトリガーを削除すると、トリガー選択画面が出てきます。

フォルダー内にファイルが作成されたとき(非推奨) を削除


ステップの削除 OK


フローを手動でトリガーする 選択


実行します。

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: '。

XRM API に対する要求が失敗しました。

子フローを呼び出す親フローを作成します。
このとき、トリガーは、先ほどエラーを確認した
フォルダー内にファイルが作成されたとき(非推奨)
を選択します。


子フローの実行 アクションを追加して、先ほど作成したフローを選択します。
親フローの構成は、以下の通りです。

親フローの構成


実行します。

親フローの実行結果


成功しました!


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 untilLoopEndtrue になるまでループ

複数の項目の取得 で ID が varID よりも大きいレコードを 5000 件取得 ※1

作成returnValue と 5000 件取得結果をマージ ※2

作成 の結果を returnValue に設定 ※2

複数の項目の取得 の結果が空かどうか?

はい:LoopEndtrue にして、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分割で表示されています。)

5000 件問題フリーのフロー1


5000 件問題フリーのフロー2


5000 件問題フリーのフロー3


動作確認します。

5000 件問題フリーのフロー動作確認

取得完了までの時間はカットしています。


13000 件取得できました!
OK!


loading...