Azure Logic Apps 内のワークフロー アクションを繰り返す、または配列を処理するループを作成する
適用対象: Azure Logic Apps (従量課金)
ロジック アプリ ワークフローで配列を処理するために、For each ループを作成できます。 このループでは、配列の項目ごとに 1 つ以上のアクションが繰り返されます。 "For each" ループで処理できる配列項目の数に対する制限については、「コンカレンシー、ループ、および分割処理の制限」をご覧ください。
条件が満たされるか状態が変わるまでアクションを繰り返すには、Until ループを作成できます。 ワークフローでは、まずループ内部のすべてのアクションが実行されてから、条件や状態がチェックされます。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ワークフローで処理できる "Until" ループの回数の既定値と上限値については、「コンカレンシー、ループ、および分割処理の制限」をご覧ください。
ヒント
配列を受け取るトリガーがあり、各配列項目のワークフローを実行する場合は、SplitOn トリガー プロパティを使用してその配列を "バッチ解除" できます。
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
ロジック アプリ ワークフローに関する基本的な知識
"For each" ループ
"For each" ループは、配列項目ごとに 1 つ以上のアクションを繰り返し、配列でのみ動作します。 "For each" ループを使用する場合の考慮事項のいくつかを次に示します:
"For each" ループは、制限された数の配列項目を処理できます。 この制限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
既定では、"For each" ループのイテレーションは同時または並列に実行されます。 この動作は、Power Automate の Apply to each ループとは異なっています。このループ内では、イテレーションは一度に 1 つずつ、つまり順番に実行されます。 ただし、シーケンシャル "For each" ループ イテレーションを設定することもできます。 たとえば、"Foreach" ループ内の次のイテレーションを遅延アクションを使用して一時停止するには、そのループが順番に実行されるように設定する必要があります。
この既定の動作の例外は、入れ子になったループです。このループでは、イテレーションは常に、並列ではなく順番に実行されます。 入れ子になったループ内の項目に対して並列で操作を実行するには、子ロジック アプリ ワークフローを作成して呼び出します。
各ループ イテレーション中での変数に対する操作の予測可能な結果を取得するには、これらのループを順番に実行します。 たとえば、同時実行ループが終了すると、変数操作に対する増分、減分、追加で予測可能な結果が返されます。 ただし、同時実行ループでの各イテレーション中に、これらの操作で予期しない結果が返される可能性があります。
"For each" ループのアクションは、
@item()
の式を使用して、配列内の各項目を参照して処理します。 配列にないデータを指定すると、ロジック アプリのワークフローが失敗します。
このロジック アプリ ワークフローの例では、Web サイト RSS フィードの日次サマリーを送信します。 ワークフローは"For each" ループを使用して、新しい項目ごとにメールを送信します。
Outlook.com アカウントや、職場または学校のアカウントを使用して、この例の従量課金ロジック アプリ ワークフローを作成します。
RSS トリガーとメール送信アクションの間に、"For each" ループを追加します。
ステップの間にループを追加するには、これらのステップ間の矢印の上にポインターを移動します。 表示されるプラス記号 (+) を選択し、[アクションの追加] を選択します。
検索ボックスの下で、[すべて] を選択します。 検索ボックスに「for each」と入力します。 アクション リストから、[For each] という制御アクションを選択します。
これでループをビルドします。 [動的なコンテンツの追加] リストが表示された後に、 [Select an output from previous steps](前のステップから出力を選択する) で、RSS トリガーからの出力である [フィード リンク] 配列を選択します。
注意
選択できるのは。前のステップからの配列の出力 "のみ" です。
選択した配列がここに表示されます。
各配列項目でアクションを実行するには、電子メールを送信する アクションをループにドラッグします。
ワークフローは次の例のようになります:
ワークフローを保存します。 ロジック アプリを手動でテストするには、デザイナー ツール バーで [トリガーの実行]>[実行] を選択します。
"Foreach" ループの定義 (JSON)
ロジック アプリをコード ビューで操作している場合、代わりに次の例のようにロジック アプリの JSON 定義で Foreach
ループを定義できます。
"actions": {
"myForEachLoopName": {
"type": "Foreach",
"actions": {
"Send_an_email": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "@{item()}",
"Subject": "New CNN post @{triggerBody()?['publishDate']}",
"To": "me@contoso.com"
},
"host": {
"api": {
"runtimeUrl": "https://logic-apis-westus.azure-apim.net/apim/office365"
},
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"foreach": "@triggerBody()?['links']",
"runAfter": {}
}
}
"Foreach" ループ:シーケンシャル
既定では、"Foreach" ループのサイクルは並列に実行されます。 各サイクルをシーケンシャルに実行するには、ループの [シーケンシャル] オプションを設定します。 予測可能な結果が想定されるループ内でループや変数を入れ子にしている場合、"Foreach" ループは順番に実行する必要があります。
ループの右上隅で、省略記号 (...) >[設定] と選択します。
[同時実行制御] で、 [同時実行制御] 設定を [オン] にします。 [並列処理の次数] スライダーを 1 まで動かし、 [完了] を選択します。
ロジック アプリの JSON 定義を使用している場合、operationOptions
パラメーターを追加することにより Sequential
オプションを使用できます。たとえば次のようになります。
"actions": {
"myForEachLoopName": {
"type": "Foreach",
"actions": {
"Send_an_email": { }
},
"foreach": "@triggerBody()?['links']",
"runAfter": {},
"operationOptions": "Sequential"
}
}
"Until" ループ
アクションを実行し、条件が満たされるか、状態が変更されるまで繰り返すには、これらのアクションを "Until" ループに入れます。 ロジック アプリでは最初にループ内部のすべてのアクションが実行されて、条件または状態がチェックされます。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ロジック アプリの実行で処理できる "Until" ループの数の既定値と上限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
"Until" ループを使用できる一般的なシナリオをいくつか紹介します。
必要なレスポンスを受け取るまでエンドポイントを呼び出す。
データベース内にレコードを作成する。 そのレコード内の特定のフィールドが承認されるまで待機します。 処理し続けます。
このロジック アプリ例は、毎日午前 8 時 00 分に開始し、ある変数の値が 10 と等しくなるまでその変数を増分させます。 その後、このロジック アプリは現在の値を確認する電子メールを送信します。
注意
これらの手順では Office 365 Outlook を使用できますが、Logic Apps がサポートするどの電子メール プロバイダーでも使用できます。 こちらからコネクタの一覧を確認してください。 別の電子メール アカウントを使用する場合、おおよその手順は変わりませんが、UI の表示がやや異なることがあります。
空のロジック アプリを作成します。 ロジック アプリ デザイナーの検索ボックスの下で、 [すべて] を選択します。 「定期的」を検索します。 トリガーの一覧から、 [定期的なスケジュール] を選択します。
間隔、頻度、時刻を設定して、トリガーが実行されるタイミングを指定します。 時刻を設定するには、 [詳細オプションを表示する] を選択します。
プロパティ 値 間隔 1 頻度 日 設定時刻 (時間) 8 トリガーで、 [新しいステップ] を選択します。 "変数" を検索し、次のアクションを選択します: [変数の初期化 - 変数]
次の値を使用して変数を設定します。
プロパティ 値 説明 名前 制限 変数の名前 Type Integer 変数のデータ型 Value 0 変数の開始値 [変数を初期化する] アクションの下で、 [新しいステップ] を選択します。
検索ボックスで、 [すべて] を選択します。 "期限" を検索し、次のアクションを選択します: [期限 - コントロール]
Limit 変数と is equal to 演算子を選択して、ループの終了条件をビルドします。 比較対象値として 10 と入力します。
ループ内で、 [アクションの追加] を選択します。
検索ボックスで、 [すべて] を選択します。 "変数" を検索し、次のアクションを選択します: [変数の値を増やす - 変数]
[名前] には、Limit 変数を選択します。 [値] には、「1」と入力します。
ループ外部の下側で、 [新しいステップ] を選択します。
検索ボックスで、 [すべて] を選択します。 電子メールを送信するアクションを検索し、追加します。たとえば、次のようにします。
メッセージに従ってメール アカウントにサインインします。
電子メール アクションのプロパティを設定します。 件名に Limit 変数を追加します。 こうすることで、次のように、変数の現在の値が指定の条件と一致していることを確認できます。
プロパティ 値 説明 To <email-address@domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。 件名 "Limit" の現在の値は Limit 電子メールの件名を指定します。 この例では、Limit 変数が含まれていることを確認してください。 本文 <email-content> 送信する電子メール メッセージの内容を指定します。 この例では、任意のテキストを入力してください。 ロジック アプリを保存します。 ロジック アプリを手動でテストするには、デザイナーのツール バーで [実行] を選択します。
ロジックの実行が開始された後に、指定した内容の電子メールを受け取ります。
無限ループを防ぐ
"Until" ループは、これらのプロパティに基づいて実行を停止するため、これらの値を適宜設定してください。
Count:この値は、ループが終了するまでに実行されるループの最大数です。 ロジック アプリの実行で処理できる "Until" ループの数の既定値と上限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。
Timeout: この値は、すべてのループを含む "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"
]
}
}
}
この「期限」ループ例では、リソースを作成する 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",
"body": {
"resourceId": "@triggerBody()"
}
},
"runAfter": {},
"type": "ApiConnection"
}
},
"expression": "@equals(triggerBody(), 'Completed')",
"limit": {
"count": 10,
"timeout": "PT2H"
},
"runAfter": {}
}
}
サポートを受ける
- ご質問がある場合は、Azure Logic Apps に関する Microsoft QA 質問ページを参照してください。
- 機能や提案について投稿や投票を行うには、Azure Logic Apps のユーザー フィードバック サイトにアクセスしてください。