次の方法で共有


Azure Logic Apps のワークフローでアクションを繰り返すループを追加する

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

ロジック アプリ ワークフローでアクションを繰り返すには、シナリオのニーズに基づいて、 For each ループまたは Until ループをワークフローに追加できます。

ループに関する Power Automate ドキュメントをお探しですか? 「 ループを使用する」を参照してください。

ユース ケースに基づいて、次の種類のループ アクションから選択できます。

  • 配列またはコレクション内の項目に対して 1 つ以上のアクションを繰り返すには、 For each アクション をワークフローに追加します。

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

  • 条件が満たされるか、特定の状態が変更されるまで 1 つ以上のアクションを繰り返すには、 Until アクション をワークフローに追加します。

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

前提条件

次に示す手順では Azure portal を使用しますが、適切な Azure Logic Apps 拡張機能を使用すれば、次のツールでロジック アプリ ワークフローをビルドすることもできます。

一部の手順は、従量課金ワークフローと標準ワークフローのどちらであるかによって若干異なります。

For each アクションは配列でのみ機能します。 このループは、配列内の各項目に対して 1 つ以上のアクションを繰り返します。 For each アクションについて、次の考慮事項を確認します。

  • For each アクションは、制限された数の配列項目を処理できます。 この制限については、「コンカレンシー、ループ、および分割処理の制限」を参照してください。

  • 既定では、For each アクションのサイクルまたは反復は同時に並列で実行されます。

    この動作は、Power Automate の Apply to each ループとは異なっています。このループ内では、イテレーションは一度に 1 つずつ、つまり順番に実行されます。 ユース ケースでシーケンシャル処理が必要な場合は、イテレーションごとに一度に 1 つずつ実行するように設定できます。 たとえば、For each アクション内の次の反復を遅延アクションを使用して一時停止するには、各反復が順番に実行されるように設定する必要があります。

    この既定の動作の例外として、入れ子になった For each アクションの反復は、常に、並列ではなく順番に実行されます。 入れ子になった For each アクション内の配列項目に対してアクションを同時に実行するには、 子ワークフローを作成して呼び出します

  • 各反復中の変数に対する操作の予測可能な結果を取得するには、これらの反復を順番に実行します。 たとえば、同時実行の反復が終了すると、増分変数減分変数変数に追加操作で予測可能な結果が返されます。 ただし、同時実行ループでの各イテレーション中に、これらの操作で予期しない結果が返される可能性があります。

  • For each ループのアクションは、item() 関数の式を使用して、配列内の各項目を参照して処理します。 配列にないデータを指定すると、ワークフローが失敗します。

次のワークフローの例では、Web サイト RSS フィードの日次サマリーを送信します。 ワークフローは For each アクションを使用して、新しい項目ごとにメールを送信します。

  1. Azure portal で、指定した順序で次の手順を使用してロジック アプリ ワークフローを作成します。

    • "フィード項目が発行される場合" という名前の RSS トリガー

      従量課金または標準ロジック アプリ ワークフローにトリガーを追加するには、次の一般的な手順に従います。

    • "メールの送信" という名前の Outlook.com または Office 365 Outlook アクション

      従量課金または標準ロジック アプリ ワークフローにアクションを追加するには、次の一般的な手順に従います。

  2. 同じ一般的な手順に従って、RSS トリガーと送信メール アクションの間に For each アクションをワークフローに追加します。

  3. これでループをビルドします:

    1. [ For each item] で、[ 前のステップからの出力を選択 ] ボックス内を選択し、稲妻アイコンを選択します。

    2. 開いた動的コンテンツ リストの [ フィード項目が公開されたとき] で、[ フィード リンク] を選択します。これは RSS トリガーからの配列出力です。

      [フィード リンク] の出力が表示されない場合は、トリガー セクション ラベルの横にある [詳細情報] を選びます。 動的なコンテンツの一覧から、前の手順の出力のみを選択できます。

      [For each] という名前のアクションと、開いている動的コンテンツ リストを含む Azure portal とワークフロー デザイナーを示すスクリーンショット。

      完了すると、選択した配列出力が次の例のように表示されます:

      ワークフロー デザイナーと、選択した配列出力を持つ For each という名前のアクションを示すスクリーンショット。

    3. 各配列項目で既存のアクションを実行するには、メールの送信アクションを For each ループにドラッグします。

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

      スクリーンショットには、ワークフロー デザイナー、For each という名前のアクション、および [電子メールの送信] という名前のアクションが、[For each]\(各アクション\) 内に表示されます。

  4. 完了したら、ワークフローを保存します。

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

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 つずつ順番に実行する必要があります。

  1. デザイナーで、[ For each ]\(各アクション\) を選択して情報ウィンドウを開き、[ 設定] を選択します。

  2. コン カレンシー制御で、設定を オフ からオンに変更 します

  3. 並列処理の次数スライダーを 1 に移動します

    スクリーンショットは、並列処理の次数スライダーが 1 に設定された状態でオンになっている [For each action]\(各アクション\) 、[設定] タブ、およびコンカレンシー 制御の設定を示しています。

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 でサポートされている任意の電子メール プロバイダーを使用できます。 別のメール アカウントを使用する場合、一般的な手順は変わりませんが、外観は若干異なります。

  1. Azure portal で、空のワークフローを含むロジック アプリ リソースを作成します。 前の手順を参照してください。

  2. デザイナーで、一般的な手順に従って、Recurrence という名前の組み込みトリガーを従量課金または標準ワークフローに追加します。

  3. 繰り返しトリガーで、トリガーが起動する間隔、頻度、および時間を指定します。

    パラメーター
    間隔 1
    頻度
    設定時刻 (時間) 8
    この分 00

    [頻度] を [] に設定すると、[これらの時間] と [これらの] が表示されます。

    完了すると、[繰り返し] トリガーは次の例のようになります:

    繰り返しトリガー パラメーターが設定された Azure portal とワークフロー デザイナーを示すスクリーンショット。

  4. トリガーの下で、次の一般的な手順に従って、 変数初期化 という名前の組み込みアクションを 従量課金 または 標準 ロジック アプリ ワークフローに追加します。

  5. [ 変数の初期化 ] アクションで、次の値を指定します。

    パラメーター 説明
    名前 制限 変数の名前
    タイプ 整数 変数のデータ型
    価値 0 変数の開始値

    Azure portal、ワークフロー デザイナー、およびパラメーターを使用して変数を初期化という名前の組み込みアクションを示すスクリーンショット。

  6. [変数の初期化] アクションで、次の一般的な手順に従って、従量課金または標準ロジック アプリ ワークフローに Until という名前のコントロール組み込みアクションを追加します。

  7. Until アクションで、ループの停止条件を設定するために次の値を指定します。

    1. [ ループするまで ] ボックス内を選択し、稲妻アイコンを選択して動的コンテンツ リストを開きます。

    2. 一覧の [変数] で、"Limit" という名前の変数を選びます。

    3. [ カウント] で、比較値として 「10 」と入力します。

    ワークフローと組み込みアクションのスクリーンショット。Until という名前の値が記載されています。

  8. Until アクション内で、+>アクションの追加を選択します

  9. 従量課金または標準ロジック アプリ ワークフローの Until アクションに Increment 変数という名前の変数組み込みアクションを追加するには、次の一般的な手順に従います。

  10. 増分変数アクションで、次の値を指定して、Limit 変数の値を 1 ずつ増分させます。

    パラメーター
    制限 Limit 変数を選びます。
    価値 1

    [制限] が [変数の制限] に設定され、[値] が 1 に設定された [Until] という名前のワークフローと組み込みアクションを示すスクリーンショット。

  11. Until アクションの外側と下で、次の一般的な手順に従って、従量課金または標準ロジック アプリ ワークフローに電子メールを送信するアクションを追加します。

    この例では、"メールの送信" という名前の Office 365 Outlook アクションを使用して続行します。

  12. メール アクションで、次の値を指定します:

    パラメーター 説明
    から < email-address@___domain> 受信者の電子メール アドレス。 テストのために、自分の電子メール アドレスを使用します。
    件名 "Limit" 変数の現在の値:Limit メールの件名。 この例では、現在の値が指定した条件を満たすようにするために、必ず Limit 変数を含めます。

    1. [件名 ] ボックス内を選択し、稲妻アイコンを選択します。

    2. 開いた動的コンテンツリストから、[ 変数 ] セクションのヘッダーの横にある [ 詳細を表示] を選択します。

    3. [Limit] を選びます。
    本文 < email-content> 送信するメール メッセージの内容。 この例では、任意のテキストを入力します。

    完了すると、メール アクションは次の例のようになります:

    [Send an email with property values]\(電子メールを送信する\) という名前のワークフローとアクションを示すスクリーンショット。

  13. ワークフローを保存します。

ワークフローをテストする

ロジック アプリワークフローを手動でテストするには:

  • デザイナーのツール バーの [ 実行 ] オプションから [ 実行] を選択します。

ワークフローの実行が開始された後に、指定した内容のメールを受け取ります:

サンプル ワークフローから受信した電子メールのサンプルを示すスクリーンショット。

無限ループを防ぐ

Until アクションは、オプションの Count パラメーターと Timeout パラメーターに基づいて実行を停止します。 必要に応じて、次のパラメーター値を設定してください。

パラメーター 説明
数える ループが終了するまでに実行される反復の最大数。

ワークフローで処理できる 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": {}
   }
}