【Power Automate】Apply to eachを利用する前に確認したい設定と条件

【Power Automate】Apply to eachを利用する前に確認したい設定と条件
🛡️ 超解決

Power AutomateのApply to eachは、配列やコレクションの各要素に対して繰り返し処理を行う便利なアクションです。しかし、適切に設定しないとループが想定通りに動作しなかったり、実行速度が低下したりするトラブルが発生します。本記事では、Apply to eachで困った時に確認すべき基本設定と利用条件を整理し、問題の切り分け方を解説します。設定ミスや制限事項を見落とさないように、手順に沿って確認を進めてください。

【要点】この記事で確認すること

  • 最初に見る場所: Apply to eachの入力データが配列かどうか、並列処理の設定値、ループ内で使用している変数のスコープ
  • 切り分けの軸: ループが1回も実行されない場合は入力データを確認、ループが遅い場合は並列処理とAPI制限を確認、ループ内で正しく値が反映されない場合は変数スコープやアクションの順序を確認
  • 注意点: 会社のテナントによって並列処理の上限やコネクタの呼び出し制限が異なるため、管理者に確認が必要な場合があります。また、Apply to each内でSharePointやOutlookなどのアクションを使うと、テナント側の制限に引っかかることがあります。

ADVERTISEMENT

Apply to eachが動作しない場合の基本確認

Apply to eachがまったく実行されない、または1回しか実行されない場合、まずは入力データの構造を確認してください。Apply to eachは配列(コレクション)を受け取る必要があります。単一の値やオブジェクトを直接指定してもループは1回だけ実行されるかエラーになります。

入力データが配列であることを確認する

  1. フローのApply to eachアクションを開き、「入力」フィールドに指定されている動的なコンテンツを確認します。
  2. そのコンテンツが配列型であるかどうかを、フロー実行履歴の出力を見て確認します。実行履歴を開き、Apply to eachの前のアクションの出力を展開し、値が角括弧[]で囲まれているかどうかをチェックします。
  3. もし配列でない場合は、配列を生成するアクション(例:「Select」アクションや「Filter array」アクション)を使って変換します。例えば、SharePointの「アイテムの取得」は単一のオブジェクトを返すため、そのままApply to eachに入力するとループは1回だけです。複数のアイテムをループさせたい場合は「アイテムの一覧取得」を使います。
  4. 一時的な配列を手動で作成したい場合は「作成」アクション内にJSONの配列リテラルを記述します(例:[“値1″,”値2”])。

ループ内のアクションがエラーになっていないか確認する

フロー実行履歴でApply to eachの各イテレーションを展開し、エラーが発生していないか確認します。エラーが発生するとループは途中で停止する場合があります。特に、SharePointやOutlookなどのコネクタで「404 Not Found」や「429 Too Many Requests」が返っていないか確認してください。429エラーはAPI呼び出し制限に達したことを示し、その場合ループが停止します。

並列処理の設定とその影響

Apply to eachはデフォルトで並列処理が有効になっており、複数のイテレーションを同時に実行できます。しかし、状況によっては並列処理が原因でトラブルが発生することがあります。

設定 メリット デメリット
並列処理あり(デフォルト) 処理が速くなる(特に大量のアイテムを扱う場合) ループの順序が保証されない、同一リソースへの書き込みで競合が発生する可能性がある、API呼び出し制限に達しやすい
並列処理なし(直列) 順序が保証される、競合が発生しにくい、制限に達しにくい 処理が遅くなる(アイテム数が多い場合)

並列処理の度合いを変更する手順

  1. Apply to eachアクションの右上にある「…」メニューから「設定」を開きます。
  2. 「並列処理の度合い」スライダーを調整します。1に設定すると直列実行になります。最大50まで設定できますが、テナントの制限により実際の同時実行数は異なります。
  3. 変更を保存後、フローを再実行して影響を確認します。

並列処理が原因で発生する問題と対策

並列処理が有効だと、複数のイテレーションが同時に同じSharePointリストアイテムやファイルを更新しようとして競合が発生することがあります。例えば、Apply to each内で「アイテムの更新」アクションを使い、同じアイテムを複数回更新しようとすると、バージョン競合エラーが発生する可能性があります。この場合、並列処理の度合いを1に下げるか、更新前にアイテムをロックする仕組みを導入します。また、Outlookでメールを送信する場合も、並列処理によって送信順序が保証されないため、順序が重要な場合は直列実行にしてください。

ループ内での変数とアクションの正しい扱い方

Apply to eachの中で変数を設定したり、出力を次のイテレーションに引き継ぐ場合、スコープと初期化に注意が必要です。特に、ループの外で宣言した変数をループ内で変更しても、ループが終わった後にその値が期待通りにならないことがあります。

変数のスコープと初期化

Power Automateで「変数の設定」アクションを使って変数を更新する場合、Apply to eachの外で変数を初期化(「変数の初期化」アクション)してから、ループ内で「変数の設定」を使って値を変更します。ただし、並列処理が有効な場合、複数のイテレーションが同時に変数を更新するため、最終的な値は不確定になります。確実に値を累積したい場合は、並列処理を無効にするか、代わりに「Append to string variable」や「Append to array variable」などの専用アクションを使います。

\

  1. ループの前に「変数の初期化」アクションを追加し、変数名と種類(整数、文字列など)を指定します。
  2. Apply to each内で「変数の設定」アクションを追加し、変数に新しい値を代入します。文字列や配列の場合は「Append to string variable」や「Append to array variable」を使うと安全です。
  3. フロー実行後、変数の最終値を「作成」アクションなどで出力して確認します。

ループ内でアクションの出力を次のイテレーションに利用する

ループ内で取得したデータを次のイテレーションで参照したい場合は、出力を変数に格納するか、ループ外で保持するテーブルデータを準備します。ただし、ループ内からループ外のデータに直接アクセスすることは可能ですが、並列処理の場合は注意が必要です。例えば、ループ内でSharePointからアイテムを取得し、そのIDを次のイテレーションで利用したい場合、変数を使うか、配列に蓄積して後で処理します。

パフォーマンス低下の原因と対策

Apply to eachの処理が極端に遅い場合、原因としてAPI呼び出し制限やコネクタのスロットリングが考えられます。また、ループ内で不要なアクションを繰り返している可能性もあります。

API呼び出し制限とスロットリング

Microsoft 365の各サービス(SharePoint、Outlook、Teamsなど)にはAPI呼び出しの制限があります。Apply to eachで大量のアイテムを処理する場合、短時間に多くのAPI呼び出しが発生し、429エラー(Too Many Requests)が返ってくることがあります。これによりフローが遅延したり停止したりします。対策としては、ループ内に「遅延」アクションを挿入して呼び出し間隔を空ける方法や、バッチ処理に切り替える方法があります。

  1. Apply to eachの設定で「並列処理の度合い」を小さく(例:10以下)に変更します。
  2. ループの先頭に「遅延」アクションを追加し、例えば1秒の待機を入れます(「遅延」アクションの「カウント」を1、「単位」を「秒」に設定)。
  3. テナントの制限値を管理者に確認します。制限値はドキュメントやテナント管理画面で確認できます。

不要なアクションの回避

ループ内で毎回同じデータを取得する処理は避けるべきです。例えば、ループの外で一度だけSharePointのリストアイテムを取得し、その結果をフィルターしてからApply to eachに渡すことで、API呼び出し回数を減らせます。また、条件分岐(Condition)を使って不要な処理をスキップすることも有効です。

利用条件と制限事項

Apply to eachにはいくつかの制限があります。特に会社のテナント環境では、管理者が設定したポリシーや制限により動作が異なる場合があります。

制限事項一覧

  • 最大実行時間: Power Automateのフロー1回の実行には最大30日の時間制限があります。Apply to eachが長時間かかる場合、この制限に達する可能性があります。
  • 並列処理の最大値: テナントによってデフォルトの並列処理の最大値が異なります。多くの場合50ですが、ライセンスや管理者設定で変更可能です。管理者に確認してください。
  • API呼び出し制限: 各コネクタ(SharePoint、Outlookなど)には一定時間内の呼び出し回数制限があります。例:SharePointは1分間に600リクエスト(テナント全体)など。
  • ループネスト制限: Apply to eachは最大10階層までネストできますが、パフォーマンスに大きく影響するため現実的には2~3階層にとどめるべきです。

管理者へ確認すべき情報

以下の点を管理者に問い合わせると、原因特定がスムーズになります。

  • テナントのPower Automateライセンスの種類(PremiumかStandardか)。Premiumライセンスでは制限が緩和される場合があります。
  • 並列実行の上限値と、環境に設定されているデータ損失防止ポリシー(DLP)の有無。
  • 特定のコネクタ(SharePoint、Outlookなど)のAPI制限値と、現在の使用状況。

よくある質問

Apply to eachでループが1回しか実行されません。原因は何ですか?

入力データが配列ではなく単一のオブジェクトになっている可能性が高いです。フロー実行履歴で入力データの型を確認してください。また、条件分岐などでループがスキップされている場合も考えられます。条件アクションの設定を見直してください。

ループ内で変数を増やしたいのですが、並列処理だと正しくカウントされません。どうすれば良いですか?

並列処理を無効にする(度合いを1に設定する)か、「変数の設定」の代わりに「Append to string variable」や「Append to array variable」アクションを使用します。これらのアクションはスレッドセーフで、並列処理下でも正しく累積されます。

Apply to eachの処理が途中で止まります。ログを見ると429エラーが出ています。

API呼び出し制限に達しています。並列処理の度合いを下げる、ループ内に遅延アクションを追加する、または処理をバッチに分割することを検討してください。管理者に制限値の緩和を依頼することも選択肢です。

まとめ

Apply to eachのトラブルは、入力データの確認、並列設定の調整、変数スコープの理解、そしてAPI制限の把握でほとんど解決できます。最初にフロー実行履歴を詳細に確認し、エラーメッセージやデータの構造を把握することが重要です。また、会社のテナント環境に依存する制限については、管理者と連携して適切な設定や代替案を検討してください。これらの基本を押さえておけば、Apply to eachを効果的に活用できるようになります。


この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。