Azure Logic Apps 内のワークフロー アクションを繰り返す、または配列を処理するループを作成する

適用対象: Azure Logic Apps (従量課金)

ロジック アプリ ワークフローで配列を処理するために、For each ループを作成できます。 このループでは、配列の項目ごとに 1 つ以上のアクションが繰り返されます。 "For each" ループで処理できる配列項目の数に対する制限については、「コンカレンシー、ループ、および分割処理の制限」をご覧ください。

条件が満たされるか状態が変わるまでアクションを繰り返すには、Until ループを作成できます。 ワークフローでは、まずループ内部のすべてのアクションが実行されてから、条件や状態がチェックされます。 条件が満たされると、ループが停止します。 そうでない場合は、ループが繰り返されます。 ワークフローで処理できる "Until" ループの回数の既定値と上限値については、「コンカレンシー、ループ、および分割処理の制限」をご覧ください。

ヒント

配列を受け取るトリガーがあり、各配列項目のワークフローを実行する場合は、SplitOn トリガー プロパティを使用してその配列を "バッチ解除" できます。

前提条件

"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" ループを使用して、新しい項目ごとにメールを送信します。

  1. Outlook.com アカウントや、職場または学校のアカウントを使用して、この例の従量課金ロジック アプリ ワークフローを作成します。

  2. RSS トリガーとメール送信アクションの間に、"For each" ループを追加します。

    1. ステップの間にループを追加するには、これらのステップ間の矢印の上にポインターを移動します。 表示されるプラス記号 (+) を選択し、[アクションの追加] を選択します。

      [アクションの追加] を選択

    2. 検索ボックスの下で、[すべて] を選択します。 検索ボックスに「for each」と入力します。 アクション リストから、[For each] という制御アクションを選択します。

  3. これでループをビルドします。 [動的なコンテンツの追加] リストが表示された後に、 [Select an output from previous steps](前のステップから出力を選択する) で、RSS トリガーからの出力である [フィード リンク] 配列を選択します。

    動的コンテンツ リストから選択する

    注意

    選択できるのは。前のステップからの配列の出力 "のみ" です。

    選択した配列がここに表示されます。

    配列を選択する

  4. 各配列項目でアクションを実行するには、電子メールを送信する アクションをループにドラッグします。

    ワークフローは次の例のようになります:

  5. ワークフローを保存します。 ロジック アプリを手動でテストするには、デザイナー ツール バーで [トリガーの実行]>[実行] を選択します。

"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. ループの右上隅で、省略記号 (...) >[設定] と選択します。

  2. [同時実行制御] で、 [同時実行制御] 設定を [オン] にします。 [並列処理の次数] スライダーを 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. 空のロジック アプリを作成します。 ロジック アプリ デザイナーの検索ボックスの下で、 [すべて] を選択します。 「定期的」を検索します。 トリガーの一覧から、 [定期的なスケジュール] を選択します。

    [定期的なスケジュール] トリガーの追加

  2. 間隔、頻度、時刻を設定して、トリガーが実行されるタイミングを指定します。 時刻を設定するには、 [詳細オプションを表示する] を選択します。

    定期的なスケジュールを設定する

    プロパティ
    間隔 1
    頻度
    設定時刻 (時間) 8
  3. トリガーで、 [新しいステップ] を選択します。 "変数" を検索し、次のアクションを選択します: [変数の初期化 - 変数]

    変数の初期化 - 変数 を追加する

  4. 次の値を使用して変数を設定します。

    変数のプロパティを設定する

    プロパティ 説明
    名前 制限 変数の名前
    Type Integer 変数のデータ型
    Value 0 変数の開始値
  5. [変数を初期化する] アクションの下で、 [新しいステップ] を選択します。

  6. 検索ボックスで、 [すべて] を選択します。 "期限" を検索し、次のアクションを選択します: [期限 - コントロール]

    [期限] ループを追加する

  7. Limit 変数と is equal to 演算子を選択して、ループの終了条件をビルドします。 比較対象値として 10 と入力します。

    ループを停止させる終了条件をビルドする

  8. ループ内で、 [アクションの追加] を選択します。

  9. 検索ボックスで、 [すべて] を選択します。 "変数" を検索し、次のアクションを選択します: [変数の値を増やす - 変数]

    変数の値を増やすアクションを追加する

  10. [名前] には、Limit 変数を選択します。 [値] には、「1」と入力します。

  11. ループ外部の下側で、 [新しいステップ] を選択します。

  12. 検索ボックスで、 [すべて] を選択します。 電子メールを送信するアクションを検索し、追加します。たとえば、次のようにします。

    電子メールを送信するアクションを追加する

  13. メッセージに従ってメール アカウントにサインインします。

  14. 電子メール アクションのプロパティを設定します。 件名に Limit 変数を追加します。 こうすることで、次のように、変数の現在の値が指定の条件と一致していることを確認できます。

    電子メールのプロパティを設定する

    プロパティ 説明
    To <email-address@domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。
    件名 "Limit" の現在の値は Limit 電子メールの件名を指定します。 この例では、Limit 変数が含まれていることを確認してください。
    本文 <email-content> 送信する電子メール メッセージの内容を指定します。 この例では、任意のテキストを入力してください。
  15. ロジック アプリを保存します。 ロジック アプリを手動でテストするには、デザイナーのツール バーで [実行] を選択します。

    ロジックの実行が開始された後に、指定した内容の電子メールを受け取ります。

    受信した電子メール

無限ループを防ぐ

"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": {}
   }
}

サポートを受ける

次のステップ