
Power Automateで複数件のデータを処理しようとすると、自動的にPower Automateのそれぞれに適用(Apply to each)が挿入されます。便利な反面、フローが遅い・エラーが出る原因の多くがここにあります。
Apply to eachとは何か
繰り返し処理の入れ物
それぞれに適用(Apply to each)は、配列(複数のデータの集まり)の中の要素を1件ずつ取り出して処理を繰り返すアクションです。Excelでいえば、セルの範囲を1行ずつ処理するループ処理と同じ考え方です。
たとえばSharePointリストのアイテムを複数件取得して、それぞれにメールを送りたい場合。リスト取得のアクションはアイテムの配列を返します。その後にメール送信アクションを追加すると、Power Automateが自動でそれぞれに適用(Apply to each)を挿入して、全件分のメール送信をループしてくれます。

なぜ自動で挿入されるのか
Power Automateは、配列型のデータに対してアクションを設定しようとすると、自動的にそれぞれに適用(Apply to each)を挿入します。これは仕様で、意図したかどうかに関係なく起きます。
よくある疑問は、1件しかないはずなのにApply to eachが入ったというものです。これはSharePointやOutlookの取得系アクションが、1件しかなくても配列型でデータを返すためです。1件確実に取れるとわかっていても、取得アクションの返り値が配列型である限り、Power Automateはそれぞれに適用(Apply to each)を提案してきます。
Apply to eachが遅くなる原因
デフォルトは1件ずつ順番に処理する
それぞれに適用(Apply to each)のデフォルト設定は、1件ずつ順番に処理するシリアル実行です。10件のアイテムがあれば、1件目の処理が終わってから2件目、2件目が終わってから3件目、と順番に処理します。1件あたり1秒かかる処理なら10件で10秒、100件なら100秒かかります。
フローが実際に動き出すと想定より遅い、という相談を受けたとき、大半はそれぞれに適用(Apply to each)の中で時間のかかる処理(メール送信、HTTP要求、承認アクションなど)を大量に繰り返しているケースです。
ループ内に余計なアクションが入っている
もう一つの原因は、それぞれに適用(Apply to each)の中に本来ループ外に置けるアクションが含まれているパターンです。毎回同じデータを取得するアクション(変わらないマスタデータの参照など)がループ内にあると、10件処理するなら同じデータを10回取得します。これは無駄な処理です。
それぞれに適用(Apply to each)の中に入れるのは、ループ内の各要素に依存する処理だけにするのが原則です。ループに依存しない処理はそれぞれに適用(Apply to each)の前に出して、結果を変数に保存しておきます。
Apply to eachを速くする方法
同時実行数を設定する
それぞれに適用(Apply to each)の処理を並列で実行する設定があります。それぞれに適用(Apply to each)アクションのメニューから設定を開くと、同時実行の制御というトグルがあります。これをオンにして並列度を設定すると、複数件を同時に処理するようになります。
並列度を1にするとシリアル(順番)実行、2以上にすると指定した数だけ同時に処理します。最大50まで設定できます。ただし、並列実行にすると順番が保証されなくなります。処理の順番が重要な場合(連番の採番など)は並列実行にしないようにしましょう。
実際に使ってみると、メール送信を10件シリアルで処理すると40〜50秒かかっていたものが、並列度5にすると10秒以内に終わることがあります。劇的に速くなるので、順番を問わない処理には積極的に使いましょう。
Apply to eachを使わない書き方に変える
件数が多くて速度が問題になる場合、そもそもそれぞれに適用(Apply to each)を使わない設計を検討します。SharePointのアイテムを更新するだけなら、HTTP要求でSharePointのREST APIをバッチ処理すると複数件を1回のリクエストで更新できます。ただしこれは中〜上級の話なので、最初はApply to each + 並列実行で対応するので十分です。
Apply to eachでエラーが出るときの対処法
1件のエラーで全件が止まる
デフォルトの設定では、それぞれに適用(Apply to each)の中の処理が1件でもエラーになると、そこでフロー全体が失敗します。10件のうち3件目でエラーが出ると、4件目以降は処理されません。
これを防ぐには、それぞれに適用(Apply to each)内のアクションに実行条件の構成でエラー時でも次に進む設定を入れるか、アクションをScope(スコープ)で囲んでエラーハンドリングを追加します。エラーが出た件だけスキップして残りを処理したい場合は、後者のScope + 実行条件の組み合わせが使いやすいです。
ネストしたApply to eachは避ける
それぞれに適用(Apply to each)の中にさらにそれぞれに適用(Apply to each)を入れるネスト構造は、できる限り避けましょう。外側が10件、内側が10件なら、処理の総数は100件になります。さらに内側が増えると指数的に増えて、タイムアウトや想定外の処理件数につながります。
ネストが必要になる設計のときは、外側のループ処理を先に完了させてデータを整形し、内側のループに渡す前にデータ構造をフラットにできないか検討しましょう。選択(Select)や アレイのフィルター処理(Filter Array)といったデータ操作アクションがこの整形に役立ちます。
件数が多すぎるときはデータを絞り込んでから渡す
それぞれに適用(Apply to each)に渡すデータは、できるだけ少なくしておくのが基本です。SharePointリストを取得するときに件数の上限(デフォルト100件、最大5000件)があることも意識しましょう。複数の項目の取得(Get items )アクションのフィルタークエリで事前に絞り込んでおくと、ループ処理の件数を減らせます。
複数の項目の取得(Get items)の上限を5000件に設定して全件取得してからそれぞれに適用(Apply to each)に渡す方法もありますが、処理時間が長くなります。フィルタークエリを使って必要なアイテムだけを取得してから処理するのが、速度・コストともに優れた設計です。
Apply to eachを正しく使うためのチェックリスト
それぞれに適用(Apply to each)を使うときに確認しておきたいポイントをまとめます。
- ループ内に「全件で同じ処理」がないか確認する(ある場合はループの外に出す)
- 件数が多い場合は同時実行数の設定を検討する
- 処理の順番が重要かどうかを確認し、問題なければ並列実行にする
- ネストしたApply to eachになっていないか確認する
- 渡すデータをフィルタークエリなどで事前に絞り込んでいるか確認する
- エラー時に全件が止まっていいか確認し、必要ならエラーハンドリングを追加する
Power Automateのトリガーの選び方についてはトリガーはどれを選ぶ?の記事も合わせてご覧ください。フロー全体の設計を理解するとApply to eachの使いどころも見えてきます。
まとめ
それぞれに適用(Apply to each)はPower Automateの繰り返し処理の核です。デフォルトのシリアル実行のまま大量データを処理すると遅くなるので、並列実行の設定とループ内のアクションの最小化を意識するだけで体感が大きく変わります。
最初はフローが自動でApply to eachを挿入する仕組みに戸惑うかもしれませんが、慣れてくるとなぜここにApply to eachが入るのかが自然にわかるようになります。地道な積み重ねで、フロー設計の精度は確実に上がっていきます。
