適用対象: Azure Logic Apps (従量課金 + Standard)
配列やコレクションのすべての項目に対して同じアクションを実行したり、Logic Appのワークフローで何かが完了するまで同じアクションを繰り返したい場合は、それぞれ「For each」または「Tiル」というControlアクションをワークフローに追加してください:
| アクション | Task |
|---|---|
| それぞれについて | 配列やコレクションのアイテムに対して1つ以上のアクションを繰り返します。 配列とコレクションにのみ適用されます。 ヒント:配列を扱うトリガーがあり、各配列アイテムごとにワークフローインスタンスを実行したい場合は、トリガーの Split on プロパティ を設定して配列を デバッチ 化します。 詳細は「 並行性、ループ化、ディスバッチ制限」を参照してください。 |
| Until | 条件が満たされるか、特定の状態が変わるまで、1つ以上の行動を繰り返します。 ワークフローはまずループ内のすべてのアクションを実行し、その後条件や状態を確認します。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 詳細は「 並行性、ループ化、ディスバッチ制限」を参照してください。 |
このガイドでは、ワークフローにループを追加する方法、順番に反復を実行する方法、そして終わりのないループを防ぐ方法を紹介しています。 やりたいタスクに飛び移る:
注
Power Automateのドキュメントについては、Use loopsをご覧ください。
前提条件
Azure アカウントとサブスクリプション。 無料の Azure アカウントを取得します。
ループを実行する Logic App のワークフロー。ワークフローを開始するトリガーを含みます。
ループアクションを追加する前に、ワークフローは トリガーを最初のステップとして始め なければなりません。
このガイドはAzureポータルを使用しますが、Visual Studio Codeと対応するAzure Logic Apps拡張機能を使ってロジックアプリのワークフローを構築することもできます。
各ループごとに考慮すべき点
For each actionは、各配列やコレクション項目に対して1つ以上のアクションを繰り返します。
For each actionは配列とコレクションにのみ適用されます。
For each アクションは 限られた数の配列項目を処理します。
デフォルトでは、 各アクションに対して 反復は並列で実行されます。 知っておくべき重要な行動:
Behavior 意味 デフォルトで並列 Power Automateの各ループへの適用とは異なり、イテレーションは一度に1回ずつ実行されません。
シナリオが順次処理を必要とする場合は、「 各イテレーションの実行順次処理」を参照してください。 例えば、次の反復を一時停止するには、Delayアクションを使って各アクションを順番に実行するように設定します。入れ子ループ 各アクションの入れ子にされた For Action は常に順番に実行されます。 並列実行するには、子ワークフローを作成し、呼び出します。 Variables インクリメント変数、 減量変数、 Append to変数 は並列ループで予測不能な結果を返すことがあります。 ループ内の変数が各反復中の操作から予測可能な結果を出すようにするために、 ループを順次実行してください。 For each ループのアクションは、
item()関数の式を使用して、配列内の各項目を参照して処理します。 配列にないデータを指定すると、ワークフローが失敗します。
ワークフローに「For each loop」を追加してください
次のワークフローの例では、Web サイト RSS フィードの日次サマリーを送信します。 ワークフローは For each アクションを使用して、新しい項目ごとにメールを送信します。
Azure portal で、指定された順序で次の手順に従って、ロジック アプリ ワークフローを作成します。
デザイナーのトリガーと 「メールを送信 」アクションの間に、「 For each 」というアクションを追加し、ワークフロータイプに基づく一般的な手順に従ってください:
これでループをビルドします:
「各アクション について 」で「 前のステップから出力を選択する 」ボックスで入力オプションを選択し、その後ライトニングアイコンを選択します。
開いた動的コンテンツ リストから、[フィード項目が発行される場合] の下にある [フィード リンク] を選択します。これは、RSS トリガーからの配列出力です。
注
[フィード リンク] の出力が表示されない場合は、トリガー セクション ラベルの横にある [詳細情報] を選びます。 動的なコンテンツの一覧から、前の手順の出力のみを選択できます。
以下の例は、選択された配列出力を示しています:
各配列項目で既存のアクションを実行するには、メールの送信アクションを For each ループにドラッグします。
あなたのワークフローは以下の例のようです:
ワークフローを保存します。
ワークフローを手動でテストするには、デザイナーのツール バーで [実行]>[実行] を選択します。
For each アクションの定義 (JSON)
コード ビューで操作している場合、次の例のように、ワークフローの JSON 定義で For_each アクションを定義できます:
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "@{item()}",
"Subject": "New CNN post @{triggerBody()?['publishDate']}",
"To": "me@contoso.com"
},
"host": {
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "post",
"path": "/v2/Mail"
},
"runAfter": {}
}
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach"
}
},
それぞれに対して:ループの反復を順番に実行します
既定では、For each アクションのイテレーションは同時に並列で実行されます。 ただし、入れ子になったループがある場合や、ループ内に変数があり、予測可能な結果が期待できる場合は、それらのループを一度に 1 つずつ順番に実行する必要があります。
デザイナーで、For each アクションを選択して情報ウィンドウを開き、[設定] を選択します。
[コンカレンシー制御] で、設定を [オフ] から [オン] に変更します。
[並列処理の次数] スライダーを [1] に動かします。
For each アクションの定義 (JSON): 順番に実行する
ワークフローの JSON 定義で For_each アクションをコード ビューで操作している場合は、operationOptions パラメーターを追加し、パラメーター値を Sequential に設定します。
"actions": {
"For_each": {
"actions": {
"Send_an_email_(V2)": { }
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"type": "Foreach",
"operationOptions": "Sequential"
}
}
Until ループの考慮事項
Until アクションは、必要な指定された条件が満たされるまで、1 つ以上のアクションを実行して繰り返します。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 詳細については、 並行性、ループ化、デバッチ制限を参照してください。
次の一覧には、Until アクションを使用できる一般的なシナリオがいくつか含まれています:
必要なレスポンスを受け取るまでエンドポイントを呼び出す。
データベース内にレコードを作成する。 そのレコード内の特定のフィールドが承認されるまで待機します。 処理し続けます。
既定では、Until アクションは次の方法で成功または失敗します。
Until ループは、ループ内のすべてのアクションが成功した場合、および動作後の実行に基づいてループの制限に達した場合に成功します。
Until ループの最後のイテレーションのすべてのアクションが成功した場合、Until ループ全体が成功としてマークされます。
Until ループの最後のイテレーションで何らかのアクションが失敗した場合、Until ループ全体が Failed としてマークされます。
最後のイテレーション以外のイテレーションでアクションが失敗した場合、次のイテレーションは引き続き実行され、Until アクション全体が 失敗としてマークされません。
代わりにアクションを失敗させるには、
operationOptionsという名前のパラメーターを追加し、値をFailWhenLimitsReachedに設定して、ループの JSON 定義の既定の動作を変更します。次に例を示します。"Until": { "actions": { "Execute_stored_procedure": { <...> } }, "expression": "@equals(variables('myUntilStop'), true)", "limit": { "count": 5, "timeout": "PT1H" }, "operationOptions": "FailWhenLimitsReached", "runAfter": { "Initialize_variable": [ "Succeeded" ] }, "type": "Until" }
ワークフローに Until ループを追加してください
以下のワークフロー例は、毎日午前8時に始まります。 ワークフローでは、値が 10 に等しくなるまで変数をインクリメントするために、Until アクションを使用します。 その後、このワークフローは現在の値を確認する電子メールを送信します。 この例では Office 365 Outlook を使用していますが、 Azure Logic Apps でサポートされている任意の電子メール プロバイダーを使用できます。 別のメール アカウントを使用する場合、一般的な手順は変わりませんが、外観は若干異なります。
Azure portal で、空のワークフローを含むロジック アプリ リソースを作成します。
デザイナーで、ワークフローの種類に応じて一般的な手順に従い、Schedule 組み込みトリガーの Recurrence を追加してください:
再発トリガーでは、以下の情報を提供します:
パラメーター 値 間隔 1 頻度 日 設定時刻 (時間) 8 設定時刻 (分) 00 [頻度] を [日] に設定すると、[設定時刻 (時間)] と [設定時刻 (分)] が表示されます。
以下の例は、 再帰 トリガーがどのように現れるかを示しています:
デザイナーで、ワークフロータイプに基づく一般的な手順に従って、 変数 の組み込みアクション「 Initialize variable 」を追加します。
Initialize variableアクションでは、以下の情報を提供します:
パラメーター 値 説明 名前 制限 変数の名前です。 タイプ 整数 変数のデータ型です。 価値 0 変数の初期値。 Initialize variable アクションの下に、ワークフローの種類に応じた一般的な手順に従って、Until という名前の Control 組み込みアクションを追加します。
Until アクションでは、ループの停止条件を設定します:
Loop Until ボックス内をクリックし、次に稲妻アイコンを選択して動的コンテンツの一覧を開きます。
一覧の [変数] で、"Limit" という名前の変数を選びます。
[カウント] で、比較値として「10」を入力します。
Until アクション内で、+[>アクションの追加] を選択します。
ワークフローの種類に応じた一般的な手順に従って、Until アクションに 変数 の組み込みアクション「変数をインクリメントする」を追加してください。
増分変数アクションで、次の値を指定して、Limit 変数の値を 1 ずつ増分させます。
パラメーター 値 制限 Limit 変数を選びます。 価値 1 Until アクションの外側の下に、ワークフローの種類に応じた一般的な手順に従って、メールを送信するアクションを追加します。
この例では、"メールの送信" という名前の Office 365 Outlook アクションを使用して続行します。
メール アクションで、次の値を指定します:
パラメーター 値 説明 から へ < email-address@domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。 件名 "Limit" 変数の現在の値:Limit メールの件名。 この例では、現在の値が指定した条件を満たすようにするために、必ず Limit 変数を含めます。
1. [件名] ボックス内を選択し、稲妻アイコンを選択します。
2. 開いた動的コンテンツ リストから、[変数] セクション ヘッダーの横にある [詳細情報] を選びます。
3. [Limit] を選びます。本文 < メールコンテンツ> 送信するメール メッセージの内容。 この例では、任意のテキストを入力します。 以下の例は、あなたのメールアクションがどのように表示されるかを示しています:
ワークフローを保存します。
ワークフローをテストする
ロジック アプリ ワークフローを手動でテストするには:
- デザイナーのツール バーの [実行] オプションから [実行] を選択します。
ワークフローの実行が開始された後に、指定した内容のメールを受け取ります:
無限ループを防ぐ
Until アクションは、省略可能な Count と Timeout のパラメーターに基づいて実行を停止します。 以下のパラメーター値が適切に設定されていることを確認してください。
| パラメーター | 説明 |
|---|---|
| 数える | ループが終了するまでに実行される反復の最大数。 ワークフローで処理できる Until アクションの回数の既定値と上限値については、「コンカレンシー、ループ、およびデバッチの制限」を参照してください。 |
| タイムアウト |
Until アクション (すべての反復を含む) がループが終了する前に実行される最大時間。 この値は ISO 8601 形式で指定され、反復ごとに評価されます。 ループ内のアクションがタイムアウト制限より長くなる場合、現在の反復は停止しません。 ただし、タイムアウト制限の条件が満たされているため、次の反復は開始しません。 Timeout 値の既定値と上限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。 |
Until ループの反復処理の実行履歴を確認する
Until ループを含むワークフローの実行履歴を表示すると、ループ内のアクションの詳細な状態と結果は、ループ全体の実行が完了した後にのみ使用できます。 Until ループがイテレーションを実行している間は、ループ アクションに実行中の状態が表示されますが、ループが終了するまで個々のイテレーション結果を展開または走査することはできません。
ループは、次のいずれかの条件が満たされると終了します。
- 指定した式は true に評価されます。
- ループが カウント 制限に達しました。
- ループが タイムアウト 制限に達しました。
ループが完了したら、実行履歴の Until アクションを選択して、各イテレーションとそのイテレーション内の子アクションの状態を表示できます。
注
Until ループが長時間実行される場合は、ループが完全に完了するのを待ってから、個々のイテレーションの結果について実行履歴を調べる必要があります。 実行時間の長い進行中のループを監視するには、メッセージをキューに送信したり、並列分岐で読み取ることができる変数を更新するなどして、個別に状態を出力するログ記録または通知アクションをループ内に追加することを検討してください。
アクション定義(JSON)まで
コード ビューで操作している場合、次の例のように、ワークフローの JSON 定義で Until アクションを定義できます:
"actions": {
"Initialize_variable": {
// Definition for initialize variable action
},
"Send_an_email": {
// Definition for send email action
},
"Until": {
"type": "Until",
"actions": {
"Increment_variable": {
"type": "IncrementVariable",
"inputs": {
"name": "Limit",
"value": 1
},
"runAfter": {}
}
},
"expression": "@equals(variables('Limit'), 10)",
// To prevent endless loops, an "Until" loop
// includes these default limits that stop the loop.
"limit": {
"count": 60,
"timeout": "PT1H"
},
"runAfter": {
"Initialize_variable": [
"Succeeded"
]
}
}
}
この Until ループ例では、リソースを作成する HTTP エンドポイントを呼び出します。 HTTP 応答の本文で Completed ステータスが返されると、ループは停止します。 無限ループを防ぐために、このループは次の条件のいずれかが発生する場合でも中止されます:
ループが 10 回実行された。これは
count属性で指定されています。 既定値は 60 回です。ループが 2 時間実行した。これは
timeout属性で ISO 8601 形式で指定されています。 既定値は 1 時間です。
"actions": {
"myUntilLoopName": {
"type": "Until",
"actions": {
"Create_new_resource": {
"type": "Http",
"inputs": {
"body": {
"resourceId": "@triggerBody()"
},
"url": "https://domain.com/provisionResource/create-resource"
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@equals(body('Create_new_resource'), 'Completed')",
"limit": {
"count": 10,
"timeout": "PT2H"
},
"runAfter": {}
}
}