Power Automate(パワーオートメイト)のクラウドフローは、上から順に1本道で動かすだけなら難しくありません。迷い始めるのは「金額で承認者を変えたい」「添付が3つあれば3回保存したい」「リストの行を担当者ごとにまとめたい」のように、分けたり繰り返したりする場面です。この記事では、値で処理を分ける「条件」と「スイッチ」、複数の項目を1件ずつ処理する「Apply to each」、終わるまで繰り返す「Do until」の使い方と、ループを減らして速くする方法を、社員15名ほどの「サンプル工務店」のSharePoint リストを例に書きます。最後に、今週期限の工事案件を担当者ごとに1通にまとめて知らせるフローを通して作ります。トリガーの選び方は「Power Automateのトリガー:よく使うトリガーの一覧と、動かないときの確かめ方」で書いているので、ここではトリガーより後ろの組み立てを扱います。
この記事の内容
先に決めること
分岐とループを組む前に、決めておくことが3つあります。
1. フローの中で分けるか、トリガーで止めるか
「申請中のときだけ動かしたい」のように、条件に合わないなら何もしないのであれば、フローの中の「条件」ではなく、トリガー条件で止めます。フローの中で分けると、条件に合わない実行も毎回1回分の実行として残り、実行履歴が埋まって本当の失敗が見つけにくくなります。フローの中の「条件」は、合うときと合わないときで別の処理をしたい場合に使います。
2. 1件ずつ回す必要が本当にあるか
SharePoint リストやExcelの表から行を取ってくると、結果は複数の行(配列)になります。後ろのアクションに配列を渡すと、Power Automateが自動で「Apply to each」を挟みます。便利ですが、500行あれば500回アクションが動きます。先に「配列のフィルター処理」で絞ったり、「選択」で形を変えたりして、回す回数を減らせないかを考えます。
3. 分岐の深さを3段までにする
条件の中に条件、その中にまた条件と重ねていくと、半年後に直す人が読めなくなります。制限のドキュメントでは、アクションの入れ子は8段までです。実際に運用していると、3段を超えたあたりで直す人が間違え始めます。3つ以上に分かれるなら「スイッチ」にする、深くなるなら別のフロー(子フロー)に分ける、と決めておきます。
分岐とループのアクション一覧
どれも「アクションの追加」で検索するか、「コントロール」の中から選びます。名前は2026年10月時点の日本語画面のものです。
| アクション | やること | よく使う場面 | 上限(2026年10月時点) |
|---|---|---|---|
| 条件 | 真か偽かで2つに分ける | 金額が3万円以上なら代表の承認に回す | 入れ子は全体で8段まで |
| スイッチ | 1つの値で3つ以上に分ける | 問い合わせの種類で担当チームを変える | ケースは25個まで |
| それぞれに適用する(Apply to each) | 配列の項目を1件ずつ処理する | 添付を1つずつ保存する、行ごとに更新する | Microsoft 365のライセンスでは5,000項目 |
| Do until | 条件を満たすまで繰り返す | 外のシステムの処理が終わるまで待つ | 既定60回・1時間、最大5,000回 |
| 配列のフィルター処理 | 配列から条件に合う項目だけ残す | 今週期限の案件だけにする | 項目の形は変えられない |
| 選択 | 配列の各項目の形を変える | 必要な列だけにする、名前を付け直す | 項目の数は変えられない |
「それぞれに適用する」は、Power Automateの解説やコミュニティで「Apply to each」と呼ばれることが多いアクションです。公式ドキュメントでも「それぞれに適用」「それぞれに適用する」の2つの表記があり、画面の版によって名前が少し違うことがあります。この記事のアクション名と欄の名前は2026年10月時点の日本語画面に合わせていますが、ほかにもSharePointの「アイテムを取得」のように、画面の版によって言い回しが違うものがあります。見つからないときは英語名(Apply to each、Get items など)でも検索します。
条件の書き方
1つの比較で分ける
経費精算リストに行が追加されたら、金額で承認者を分ける例です。
- 「マイ フロー」で経費精算のフローを開き、「編集」を押す
- トリガーの下の「+」→「アクションの追加」を押す
- 検索欄に「条件」と入れ、「コントロール」の「条件」を選ぶ
- 左の欄を選び、稲妻のアイコンから動的なコンテンツの「金額」を選ぶ
- 真ん中の演算子で「以上」にあたるもの(「次の値以上」など)を選ぶ
- 右の欄に
30000と入れる - 「True」の側に代表への承認のアクション、「False」の側に事務の確認のアクションを置く

クラシック デザイナーでは、分かれた先が「はいの場合」「いいえの場合」と表示されます。新しいデザイナーでは「True」「False」です。
演算子には「次の値に等しい」「次の値を含む」のほか、等しくない・で始まる・より大きいなどにあたるものがあります。演算子の表示名は画面の版で少し違うことがあるので、意味で選びます。文字の比較は大文字と小文字を区別するので、メールの件名やアドレスを比べるときは、両方を toLower() で小文字にそろえてから比べると取りこぼしが減ります。
AND と OR を組み合わせる
条件のカードには行を足せます。2行以上にすると、行どうしを「AND」(全部満たす)か「OR」(どれか1つ)でつなぐ切り替えが出ます。
| やりたいこと | 組み方 |
|---|---|
| 金額が3万円以上、かつ科目が「交通費」以外 | 2行を AND でつなぐ |
| 状態が「完了」または「中止」 | 2行を OR でつなぐ |
| 3万円以上で、科目が「接待」または「備品」 | AND の中に、OR でつないだグループを入れる |
3つ目のように AND と OR が混ざるときは、条件のカードの中でグループを作って入れ子にします。画面でのグループ作りは慣れないと間違えやすいので、混ざるときは式で書くほうが確実です。条件の左の欄に式を入れ、演算子を「次の値に等しい」、右の欄を true にします。
@and(greaterOrEquals(triggerOutputs()?['body/Amount'], 30000), or(equals(triggerOutputs()?['body/Category/Value'], '接待'), equals(triggerOutputs()?['body/Category/Value'], '備品')))
ドキュメントに載っている論理の関数は次のとおりです。
| 関数 | 意味 | 例 |
|---|---|---|
and() | 両方が真なら真 | and(greater(1,10), equals(0,0)) は偽 |
or() | どちらかが真なら真 | or(greater(1,10), equals(0,0)) は真 |
not() | 真と偽を反対にする | not(contains('200 Success','Fail')) は真 |
equals() | 等しければ真 | equals('完了','完了') は真 |
greater() / greaterOrEquals() | より大きい/以上 | greaterOrEquals(10,10) は真 |
less() / lessOrEquals() | より小さい/以下 | less(10,100) は真 |
empty() | 文字・配列・オブジェクトが空なら真 | empty('') は真 |
if() | 真なら1つ目、偽なら2つ目を返す | if(equals(1,1),'yes','no') は yes |
and() と or() の引数は、どちらも真偽値でなければなりません。and(triggerOutputs()?['body/Amount'], ...) のように数値をそのまま入れると失敗します。
空の欄で落ちないようにする
SharePoint リストの任意の列は、入力されていないと値が null になります。null と数値を比べると、条件が思いどおりに分かれません。空のときの扱いを先に決め、empty() か coalesce() で埋めてから比べます。coalesce() は最初の null でない値を返す関数で、式の書き方は「Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う」に書いています。
@greaterOrEquals(coalesce(triggerOutputs()?['body/Amount'], 0), 30000)
スイッチを使う場面
1つの値で3つ以上に分けるときは、条件を重ねずに「スイッチ」を使います。サンプル工務店のホームページの問い合わせフォームには「リフォーム」「新築」「見学会」「その他」の種類があり、種類で知らせる先を変えています。
- 「+」→「アクションの追加」で「スイッチ」を選ぶ
- 「オン」の欄に、問い合わせの種類の値を入れる
- 「ケース」の「次の値に等しい」に
リフォームと入れ、中に営業チームへの投稿を置く - 「+」でケースを足し、
新築を入れて設計への投稿を置く - 同じように
見学会のケースを足し、事務への投稿を置く - 「既定」に、どれにも当てはまらないときの処理(事務への投稿)を置く

スイッチは「等しいかどうか」でしか分けられません。「3万円以上」「含む」のような比較はできないので、その場合は条件を使います。ケースの値は文字の完全一致なので、フォームの選択肢の文言を変えると、どのケースにも当たらず「既定」に落ちます。選択肢を変えるときは、スイッチのケースも同時に直します。「既定」を空のままにせず、担当に「種類が判定できませんでした」と知らせる処理を必ず入れておくと、選択肢の変更に気づけます。
Apply to each で1件ずつ処理する
添付を1つずつ保存する
協力会社から info@ に届いた請求書メールの添付を、SharePoint の工事案件サイトに保存する例です。添付は複数ありうるので、1つずつ処理します。
- トリガーを「共有メールボックスに新しいメールが届いたとき (V2)」にし、「添付ファイルのみ」と「添付ファイルを含める」を「はい」にする
- 「+」→「アクションの追加」で「それぞれに適用する」を選ぶ
- 「以前の手順から出力を選択」の欄に、動的なコンテンツの「添付ファイル」を入れる
- ループの中の「+」で、SharePoint の「ファイルを作成する」を足す
- 「フォルダー パス」に請求書のフォルダーを選ぶ
- 「ファイル名」に添付の「名前」、「ファイル コンテンツ」に添付の「コンテンツ」を入れる

ループの外にある「ファイルを作成する」に添付の「名前」を入れようとすると、Power Automateが自動で「それぞれに適用する」を作って中に入れます。意図せずループが2重、3重にできていることがあるので、保存する前にカードの入れ子を確かめます。
ループの中で、いま処理している項目は item()、ループの名前を指定するときは items('それぞれに適用する') で取り出せます。ループの名前を「添付ごと」のように変えた場合は、items('添付ごと') になります。
items('添付ごと')?['name']
同時実行の設定
「それぞれに適用する」は、既定では1件ずつ順番に処理します。制限のドキュメントでは、同時に処理する数(並列処理の次数)を1〜50に変えられます。
- 「それぞれに適用する」のカードを選ぶ
- 構成ウィンドウの「設定」タブを開く
- 「同時実行制御」をオンにする
- 「並列処理の次数」を決める(例: 10)

同時に処理すると速くなりますが、使ってはいけない場面があります。
| 同時実行してよい | 同時実行してはいけない |
|---|---|
| 添付を別々のファイル名で保存する | ループの中で「変数を増やす」「配列変数に追加」を使う |
| 行ごとに別々のメールを送る | 前の項目の結果を次の項目で使う |
| 行ごとに別の行を更新する | 同じExcelの表に行を足していく(書き込みがぶつかる) |
ループの中で変数を使っていると、同時に動いた処理が同じ変数を書き換え合い、結果が毎回変わります。変数を使うループは、同時実行制御をオフのまま(1件ずつ)にします。
上限
Microsoft 365のライセンスで動かすフローは、制限のドキュメントの「低」のパフォーマンス プロファイルにあたり、1つの「それぞれに適用する」で処理できる項目は5,000までです。それ以上ある場合は、先に絞るか、フローを分けます。もう1つ、ループの中のアクションも1回ずつPower Platformの要求数として数えられます。「低」のプロファイルでは、24時間あたりの要求数の目安が10,000です。1,000行を回して1行あたり5つのアクションを動かすと、それだけで5,000になります。
Do until で終わるまで繰り返す
「Do until」は、条件を満たすまで中のアクションを繰り返します。中のアクションを1回動かしてから条件を確かめるので、最低1回は動きます。小さな会社のフローで使う場面は多くありません。使うのは、外のシステムに処理を頼み、終わったかどうかを数分おきに見に行くような場合です。
| 設定 | 既定 | 決め方 |
|---|---|---|
| ループの条件 | なし | 「状態が完了に等しい」のように、終わったと判断できる値 |
| 回数 | 60回 | 最大5,000回。想定の回数の2倍くらいにする |
| タイムアウト | 1時間(PT1H) | ISO 8601の形式。PT30M で30分、P1D で1日 |
回数とタイムアウトの欄は、英語の画面では Count と Timeout です。日本語画面での欄の名前は版によって違うことがあります。

中に待機のアクション(英語の画面では Delay。日本語画面では「待ち時間」などの名前)を入れないと、数秒おきに相手を呼び続けます。見に行く間隔を決めて、ループの中に待機のアクションを必ず置きます。
ループの条件: @equals(body('処理の状態を確認')?['status'], 'completed')
回数: 30
タイムアウト: PT1H
中のアクション: 処理の状態を確認 → 待機(Delay) 2分
回数かタイムアウトに達してループが止まっても、既定ではエラーにならず次のアクションに進みます。「終わらなかったのに終わった扱いで先に進む」のを防ぐため、ループの後ろに条件を置き、状態がまだ完了でなければ担当に知らせる処理を入れておきます。
人の承認を待つのにDo untilは使いません。承認は「開始して承認を待機」が人の応答まで待ってくれます。作り方は「Teamsの承認アプリとPower Automateの承認フロー:申請から承認までを作る」に書いています。
回さずに済ませる:配列のフィルター処理と選択
ループを速くする一番の方法は、ループを減らすことです。
取ってくる段階で絞る
SharePoint リストの「アイテムを取得」には「フィルター クエリ」の欄があり、ODataの書き方で条件を入れると、条件に合う行だけを取ってきます。全部の行を取ってきてから「条件」で分けるより、要求数も時間もずっと少なく済みます。
Status ne '完了' and DueDate le '@{formatDateTime(addDays(utcNow(), 7), 'yyyy-MM-dd')}'
列名は表示名ではなく内部名で書きます。「上位カウント」で取ってくる最大件数も決められます。
配列のフィルター処理
すでに手元にある配列から、条件に合う項目だけを残します。ループは使いません。
- 「+」→「アクションの追加」で「配列のフィルター処理」を選ぶ
- 「差出人」の欄に、絞りたい配列(例: 「アイテムを取得」の
value)を入れる - 条件の左に
item()?['Status']?['Value']、演算子に「次の値に等しくない」、右に完了を入れる
フィルター対象の文字は大文字と小文字が区別されます。項目の形(列の並び)は変わらず、数だけが減ります。
選択
配列の各項目から、必要な列だけを取り出したり、名前を付け直したりします。項目の数は変わりません。メールに表を載せるとき、SharePoint の行には使わない列が何十個も付いてくるので、「選択」で「案件名」「期限」「現場」だけにしてから「HTML テーブルの作成」に渡すと、読みやすい表になります。
| マップのキー | 値 |
|---|---|
| 案件名 | item()?['Title'] |
| 期限 | formatDateTime(item()?['DueDate'], 'M/d') |
| 現場 | item()?['Site'] |

「選択」のマップの右上の切り替えで、キーと値の表から1つの式を入れる形に変えられます。ここに item()?['Manager']?['Email'] を入れると、担当者のメールアドレスだけが並んだ配列ができます。この形を次の例で使います。
例:今週期限の案件を担当者ごとにまとめて通知する
サンプル工務店の工事案件リストには、案件名・現場・担当(ユーザーの列)・期限・状態の列があります。毎週月曜の朝8時に、7日以内に期限が来る未完了の案件を、担当者ごとに1通のメールにまとめて送ります。
最初に作ったフローは、入れ子のループでした。案件を全部取ってきて「それぞれに適用する」で回し、その中で担当者の一覧をまた回して一致するか比べる形です。案件80件・担当者10名で800回の比較が動き、1回の実行に十数分かかったうえ、同じ担当者に案件の数だけメールが届きました。入れ子のループは、外側の数かける内側の数だけ動きます。さらにドキュメントにあるとおり、入れ子の内側のループは同時実行にしても順番にしか動かないため、同時実行の設定でも速くなりません。
直した形は、ループを1つだけにします。
| 順番 | アクション | 名前 | やること |
|---|---|---|---|
| 1 | 繰り返し | 毎週月曜8時 | 「頻度」を週、「設定曜日」を月曜日、「設定時刻(時間)」を8、「設定時刻(分)」を0、タイムゾーンを大阪、札幌、東京にする(設定曜日と設定時刻は頻度が日か週のときだけ出る) |
| 2 | アイテムを取得 | 今週期限の案件 | フィルター クエリで未完了かつ7日以内に絞る |
| 3 | 選択 | 担当者を抜き出す | 式の形で担当者のメールアドレスだけの配列にする |
| 4 | 作成 | 担当者の一覧 | 重複を消す |
| 5 | それぞれに適用する | 担当者ごと | 担当者の一覧を1人ずつ回す |
| 6 | 配列のフィルター処理(ループの中) | その人の案件 | 案件の中から、その担当者のものだけ残す |
| 7 | 選択(ループの中) | 表の形にする | 案件名・現場・期限だけにする |
| 8 | HTML テーブルの作成(ループの中) | 表 | メールに載せる表を作る |
| 9 | メールを送信する (V2)(ループの中) | 担当者に送る | 宛先にその担当者を入れて送る |
2のフィルター クエリです。
Status ne '完了' and DueDate ge '@{formatDateTime(utcNow(), 'yyyy-MM-dd')}' and DueDate le '@{formatDateTime(addDays(utcNow(), 7), 'yyyy-MM-dd')}'
4の「作成」の入力には、同じ配列どうしの union() を入れます。union() は2つの配列を合わせて重複を除く関数なので、同じ配列を2つ渡すと重複のない一覧になります。
union(body('担当者を抜き出す'), body('担当者を抜き出す'))
5の「それぞれに適用する」には、4の出力を入れます。6の「配列のフィルター処理」の「差出人」に2の value を入れ、条件は式で書きます。
@equals(item()?['Manager']?['Email'], items('担当者ごと'))
item() は「配列のフィルター処理」がいま見ている案件、items('担当者ごと') はループでいま処理している担当者のメールアドレスです。

9の「メールを送信する (V2)」は、「宛先」に items('担当者ごと')、「件名」に「今週期限の案件」、「本文」に8の出力を入れます。この形で、案件80件・担当者10名でも、ループは10回、メールは10通です。実行は1分ほどで終わるようになりました。
時刻とタイムゾーンの決め方は「Power Automateのスケジュール実行:毎朝・毎週・月末に動くフローを作る」、メールに載せる表と本文の作り方は「Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る」も参考になります。
応用:ループの中で失敗しても止めない
「それぞれに適用する」の中で1件だけ失敗すると、既定ではループ全体が失敗扱いになります。10件の添付のうち1件のファイル名に使えない文字が入っていた、という程度で残りの処理の結果が見えにくくなるので、ループの中の処理を「スコープ」で囲み、失敗したときだけ担当に知らせる形にしておきます。スコープと「実行条件の構成」の使い方は「Power Automateのエラー処理と実行履歴:失敗に気づき、直して再実行する」で書いています。
できないことと、その代わり
| やりたいこと | できるか | 代わりの手 |
|---|---|---|
| 5,000件を超える行を1回のフローで回す | Microsoft 365のライセンスでは上限にかかる | 取ってくる段階で絞る。月ごと・担当ごとにフローを分ける |
| ループの途中で抜ける(break) | 「それぞれに適用する」にはない | 先に「配列のフィルター処理」で対象だけにしてから回す |
| 1つのフローで数万行の集計をする | 向かない | Excelのピボットや、データベース・BIツールに任せる |
| スイッチで「以上」「含む」で分ける | できない | 「条件」を使うか、式で区分の文字を作ってからスイッチにかける |
| 同時実行で変数を安全に足し上げる | できない | 同時実行をやめるか、「選択」と length() で数える |
| 人の返事が来るまで Do until で待つ | 回数と時間を無駄に使う | 承認のアクションか、返事をトリガーにした別のフローにする |
ループで何千行も回して集計するような処理は、Power Automateの得意分野ではありません。数が多くなる処理は、Excelの関数やピボット、Power Automate for desktop(Power Automate Desktop)でのExcel操作、またはデータベースを使う仕組みに任せるほうが速く、止まりません。
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| 知らないうちに「それぞれに適用する」が2重になっている | 配列の中の値を、ループの外のアクションに入れたため自動で作られた | 入れ子を確かめ、外側の不要なループからアクションを出して消す |
| 条件が常に False になる | 数値と文字を比べている。選択肢の列で Value を付け忘れている | 実行履歴で値と型を見る。選択肢の列は ?['Value'] まで書く |
| 空の行で条件が失敗する | 任意の列が null | coalesce() か empty() で空のときの値を決めてから比べる |
| 件名の判定で取りこぼす | 大文字と小文字の違い | toLower() で両方をそろえて比べる |
| スイッチがいつも「既定」に落ちる | 選択肢の文言を変えた、前後に空白がある | ケースの値を今の選択肢に合わせる。trim() で空白を消す |
| ループの結果が毎回違う | 同時実行と変数を一緒に使っている | 同時実行制御をオフにするか、変数を使わない形にする |
| 入れ子のループで十数分かかる | 外側かける内側の回数だけ動いている。内側は順番にしか動かない | ループを1つにして、中で「配列のフィルター処理」を使う |
| 同じ人に何通もメールが届く | 案件ごとに送っている | 担当者の一覧を union() で作り、担当者ごとに回す |
| Do until が終わらないのに先に進む | 回数かタイムアウトに達して止まった | ループの後ろで状態を確かめる条件を置く |
| ループの中の失敗で全体が失敗になる | 1件の失敗がループ全体の結果になる | スコープで囲み、失敗時だけ知らせる |

次にやること
条件とループの中で使う式(日付の計算、文字の取り出し、配列の扱い)は「Power Automateの式と変数:日付・文字列・配列をよく使う関数で扱う」で一覧にしています。ループの中で失敗したときの気づき方と直し方は「Power Automateのエラー処理と実行履歴:失敗に気づき、直して再実行する」へ進んでください。きっかけの設定を見直すなら「Power Automateのトリガー:よく使うトリガーの一覧と、動かないときの確かめ方」、Excelの表を回して転記や集計をするなら「Power AutomateでExcelを自動化:表に行を足す・転記する・集計を送る」が次の記事です。