適用対象: Azure Logic Apps (従量課金 + Standard)
ロジック アプリ ワークフローでアクションを繰り返すために、Azure Logic Apps では、このタスクのワークフローへのループ アクションの追加がサポートされています。
注
ループに関する Power Automate ドキュメントをお探しですか? ループの使用を参照してください。
ユース ケースに基づいて、次の種類のループ アクションから選択できます。
配列またはコレクション内の項目に対して 1 つ以上のアクションを繰り返すには、 For each アクション をワークフローに追加します。
または、配列を受け取るトリガーがあり、各配列項目の反復を実行する場合は、SplitOn トリガー プロパティを使用してその配列をバッチ解除できます。
条件が満たされるか、特定の状態が変更されるまで 1 つ以上のアクションを繰り返すには、 Until アクション をワークフローに追加します。
ワークフローでは、まずループ内部のすべてのアクションが実行されてから、条件や状態がチェックされます。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ワークフローで処理できる Until ループの回数の既定値と上限値については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
ロジック アプリ ワークフローに関する基本的な知識
For each
For each アクションは、配列でのみ動作し、配列内の各項目に対して 1 つ以上のアクションを繰り返します。 次の一覧には、For each アクションを使用する場合のいくつかの考慮事項が含まれています:
For each アクションは、制限された数の配列項目を処理できます。 この制限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
既定では、For each アクションのサイクルまたは反復は同時に並列で実行されます。
この動作は、Power Automate の Apply to each ループとは異なっています。このループ内では、イテレーションは一度に 1 つずつ、つまり順番に実行されます。 ただし、For each の反復を順番に設定することもできます。 たとえば、For each アクション内の次の反復を遅延アクションを使用して一時停止するには、各反復が順番に実行されるように設定する必要があります。
この既定の動作の例外として、入れ子になった For each アクションの反復は、常に、並列ではなく順番に実行されます。 入れ子になったループ内の項目に対して並列で操作を実行するには、子ロジック アプリ ワークフローを作成して呼び出します。
各反復中の変数に対する操作の予測可能な結果を取得するには、これらの反復を順番に実行します。 たとえば、同時実行の反復が終了すると、増分変数、減分変数、変数に追加操作で予測可能な結果が返されます。 ただし、同時実行ループでの各イテレーション中に、これらの操作で予期しない結果が返される可能性があります。
For each ループのアクションは、
item()
関数の式を使用して、配列内の各項目を参照して処理します。 配列にないデータを指定すると、ワークフローが失敗します。
次のワークフローの例では、Web サイト RSS フィードの日次サマリーを送信します。 ワークフローは For each アクションを使用して、新しい項目ごとにメールを送信します。
従量課金と Standard のどちらのワークフローを使用しているかに基づいて、対応する手順に従ってください。
Azure portal で、指定された順序で次の手順に従って、従量課金ロジック アプリ ワークフローの例を作成します:
"フィード項目が発行される場合" という名前の RSS トリガー
詳細については、こちらの一般的な手順に従ってトリガーを追加します。
"メールの送信" という名前の Outlook.com または Office 365 Outlook アクション
詳細については、こちらの一般的な手順に従ってアクションを追加します。
同じ一般的な手順に従って、RSS トリガーとワークフローのメールの送信 アクションの間に 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: 順番に実行する
既定では、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 ループの最後のイテレーションで何らかのアクションが失敗した場合、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_8": [ "Succeeded" ] }, "type": "Until" }
次のワークフローの例では、毎日午前 8:00 時から、Until アクションが変数の値が 10 になるまで変数を増分させます。 その後、このワークフローは現在の値を確認する電子メールを送信します。 この例では Office 365 Outlook を使用していますが、 Azure Logic Apps でサポートされている任意の電子メール プロバイダーを使用できます。 別の電子メール アカウントを使用する場合、おおよその手順は変わりませんが、UI の表示がやや異なることがあります。
Azure portal で、空のワークフローを使用して従量課金ロジック アプリ リソースを作成します。
デザイナーで、こちらの一般的な手順に従って、"スケジュール" という名前の組み込みの [繰り返し] トリガーをワークフローに追加します。
[繰り返し] トリガーで、トリガーを起動する間隔、頻度、時刻を指定します。
プロパティ 値 間隔 1 頻度 日 設定時刻 (時間) 8 [設定時刻] パラメータを追加するには、[新しいパラメータの追加] 一覧を開き、[設定時刻] を選択します。これは、[頻度] を [日] に設定した後にのみ表示されます。
完了すると、[繰り返し] トリガーは次の例のようになります:
トリガーで、こちらの一般的な手順に従って "変数の初期化" という名前の変数組み込みアクションをワークフローに追加します。
[変数の初期化] アクションで、次の値を指定します:
プロパティ 値 説明 名前 制限 変数の名前 タイプ 整数 変数のデータ型 価値 0 変数の開始値 [変数の初期化] アクションで、こちらの一般的な手順に従って "Until" という名前の制御組み込みアクションをワークフローに追加します。
Until アクションで、ループの停止条件を設定するために次の値を指定します。
[値を選択] という名前の左端のボックス内を選択すると、動的なコンテンツの一覧が自動的に開きます。
一覧の [変数] で、"Limit" という名前の変数を選びます。
中央の演算子ボックスで、[次の値に等しい] 演算子を選びます。
[値を選択] という名前の右端のボックスに、比較値として「10」と入力します。
[Until] アクション内で、[アクションの追加] を選びます。
[操作の選択] 検索ボックスで、こちらの一般的な手順に従って、"増分変数" という名前の変数組み込みアクションを Until アクションに追加します。
増分変数アクションで、次の値を指定して、Limit 変数の値を 1 ずつ増分させます。
プロパティ 値 名前 Limit 変数を選びます。 価値 1 外部と Until アクションで、こちらの一般的な手順に従って、メールを送信するアクションを追加します。
この例では、"メールの送信" という名前の Office 365 Outlook アクションを使用して続行します。
メール アクションで、次の値を指定します:
プロパティ 値 説明 から へ <email-address@domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。 件名 "Limit" 変数の現在の値:Limit メールの件名。 この例では、現在の値が指定した条件を満たすようにするために、必ず Limit 変数を含めます。
1. [件名] ボックス内を選択して、動的なコンテンツの一覧を表示します。
2. 動的なコンテンツの一覧で、[変数] セクション ヘッダーの横にある [詳細情報] を選びます。
3. [Limit] を選びます。本文 <email-content> 送信するメール メッセージの内容。 この例では、任意のテキストを入力します。 完了すると、メール アクションは次の例のようになります:
ワークフローを保存します。
ワークフローをテストする
ロジック アプリ ワークフローを手動でテストするには、従量課金ロジック アプリ ワークフローと Standard ロジック アプリ ワークフローのどちらを使用しているかに応じて、手順に従います。
ワークフローの実行が開始された後に、指定した内容のメールを受け取ります:
無限ループを防ぐ
Until アクションは、次のプロパティに基づいて実行を停止します。このプロパティは、アクションで [制限の変更] を選んで表示できます。 これらのプロパティ値は、適宜設定してください:
プロパティ | 説明 |
---|---|
数える | ループが終了するまでに実行される反復の最大数。 ワークフローで処理できる Until アクションの回数の既定値と上限値については、「コンカレンシー、ループ、およびデバッチの制限」を参照してください。 |
タイムアウト | Until アクション (すべての反復を含む) がループが終了する前に実行される最大時間。 この値は ISO 8601 形式で指定され、反復ごとに評価されます。 ループ内のアクションがタイムアウト制限より長くなる場合、現在の反復は停止しません。 ただし、タイムアウト制限の条件が満たされているため、次の反復は開始しません。 Timeout 値の既定値と上限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。 |
"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": {}
}
}