共用方式為


新增迴圈以在 Azure Logic Apps 的工作流程中重複動作

適用於:Azure Logic Apps (使用量 + 標準)

若要在邏輯應用程式工作流程中重複動作,您可以根據您的案例的需求,將 For each 迴圈或 Until 迴圈新增至您的工作流程。

附註

尋找有關迴圈的 Power Automate 文件嗎? 請參閱使用迴圈

根據您的使用案例,您可以選擇下列類型的循環動作:

  • 若要對數位或集合中的項目重複一或多個動作,請將 For each 動作 新增至您的工作流程。

    或者,如果您有一個可以處理陣列的觸發程序,並且想要針對每個陣列項目執行一個工作流程執行個體,則可以透過設定 Split on 觸發程序屬性來對陣列進行拆批處理

  • 若要重複一或多個動作,直到符合條件或特定狀態變更為止,請將 Until 動作 新增至您的工作流程。

    工作流程會先執行迴圈內的所有動作,然後檢查條件或狀態。 如果符合條件,則迴圈會停止。 否則,迴圈會重複。 如需工作流程可擁有的 Until 迴圈數目的預設值和上限,請參閱並行、迴圈和解除批次處理限制

先決條件

下列步驟會使用 Azure 入口網站進行,但若搭配適當的 Azure Logic Apps 延伸模組,則也可以使用下列工具來建置邏輯應用程式工作流程:

根據您擁有的是「取用」工作流程還是「標準」工作流程,某些步驟會略有不同。

For each

For each 動作僅適用於陣列。 此迴圈會對陣列中的每個項目重複一或多個動作。 檢閱 For each 動作的下列考量事項:

  • For each 動作可以處理數目有限的陣列項目。 如需了解此限制,請參閱並行、迴圈和解除批次處理限制

  • 依預設,For each 動作中的迴圈或反覆運算會同時平行執行。

    此行為不同於 Power Automate 的套用至每個迴圈,其中反覆項目一次執行一個,或依序執行。 如果您的使用案例需要循序處理,您可以For each 反覆項目設定為一次執行一個。 例如,如果您想要使用 Delay 動作暫停 For each 動作中的下一個反覆運算,您必須設定每個反覆運算以循序執行。

    作為預設行為的例外狀況,巢狀 For each 動作的反覆運算一律會循序執行,而不是平行執行。 若要在巢狀 For each 動作中對陣列項目同時執行動作,請建立並呼叫子工作流程

  • 若要在每個反覆運算期間,從針對變數所執行的作業獲得可預測的結果,請循序執行這些反覆運算。 例如,當同時執行的反覆運算結束時,遞減變數遞減變數附加至變數作業會傳回可預測的結果。 不過,在並行執行迴圈中的每個反覆項目執行期間,這些作業可能會傳回無法預測的結果。

  • For each 迴圈中的動作會使用 item() 函式來參考和處理陣列中的每個項目。 如果您指定的資料不是在陣列中,則工作流程將會失敗。

下列範例工作流程會傳送網站 RSS 摘要的每日摘要。 工作流程會使用對為每個新項目傳送電子郵件的 For each 動作。

  1. Azure 入口網站中,依指定順序執行下列步驟以建立邏輯應用工作流程:

    • 名為摘要項目發佈時RSS 觸發程序

      遵循下列一般步驟,將觸發程序新增至取用標準邏輯應用工作流程。

    • 名為傳送電子郵件Outlook.comOffice 365 Outlook 動作

      遵循下列一般步驟,將動作新增至取用標準邏輯應用工作流程。

  2. 遵循相同的一般步驟,在工作流程中的 RSS 觸發程序和傳送電子郵件動作之間新增 For each 動作。

  3. 現在建置迴圈:

    1. For each 項目中,在 [從先前步驟中選取輸出] 方塊內選取,然後選取閃電圖示。

    2. 從開啟的動態內容清單中,在 [當摘要項目發佈時] 底下,選取 [摘要連結],這是來自 RSS 觸發程序的陣列輸出。

      附註

      如果 [摘要連結] 輸出未出現,請在觸發程序區段標籤旁,選取 [顯示較多]。 從動態內容清單中,您可以選取僅限先前步驟中的輸出。

      螢幕擷取畫面顯示了 Azure 入口網站和工作流程設計工具,其中包含名為「For each」的動作以及開啟的動態內容清單。

      完成時,選取的陣列輸出的顯示如下範例所示:

      螢幕擷取畫面顯示了工作流程設計工具和名為「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. 在設計工具上,選取 For each 動作以開啟資訊窗格,然後選取 [設定]

  2. 在 [並行控制] 底下,將設定從 [關閉] 變更為 [開啟]

  3. 平行度滑桿移至 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 動作會執行並重複一或多個動作,直到符合所需的指定條件為止。 如果符合條件,則迴圈會停止。 否則,迴圈會重複。 如需 Until 動作或反覆項目的數目的預設值和上限,請參閱並行、迴圈和拆批處理限制

下列清單包含您可以在其中使用 Until 動作的一些常見案例:

  • 呼叫端點,直到您獲得想要的回應。

  • 在資料庫中建立記錄。 等到該記錄中的特定欄位獲得核准。 繼續處理。

依預設,Until 動作會以下列方式成功或失敗:

  • 「Until」迴圈只有在迴圈中的所有動作都成功執行,且根據執行後行為達到迴圈限制時,才會視為成功。

  • 如果 Until 循環最後一次反覆運算中的所有動作都成功,整個 Until 迴圈會標示為 Succeeded

  • 如果 Until 循環的最後一個反覆專案中有任何動作失敗,整個 Until 迴圈會標示為 失敗

  • 如果任何動作在最後一個反覆項目之外的反覆項目中失敗,則下一個反覆項目會繼續執行,而且整個 Until 動作不會被標記為失敗

    若要改為讓動作失敗,請在迴圈的 JSON 定義中變更預設行為 (方法是新增名為 operationOptions 的參數,並將值設為 FailWhenLimitsReached),例如:

    "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 入口網站中,建立一個包含空白工作流程的邏輯應用資源。 請參閱先前的程序。

  2. 在設計工具中,遵循一般步驟,將名為 [定期] 的 [排程] 內建觸發程序新增至您的取用標準工作流程。

  3. 在 [定期] 觸發程序中,指定觸發程序引發的間隔、頻率和時間。

    參數
    間隔 1
    頻率 Day
    在這幾小時內 8
    在這幾分鐘內 00

    頻率設定為後,會顯示在這些小時在這些分鐘

    當您完成時,定期觸發程序看起來類似下列範例:

    螢幕擷取畫面顯示了 Azure 入口網站和工作流程設計工具 (設定了 [定期] 觸發程序參數)。

  4. 在觸發程序下,遵循下列一般步驟,將名為 [初始化變數] 的 [變數] 內建動作新增至您的取用標準邏輯應用程式工作流程。

  5. 在 [初始化變數] 動作中,提供下列值:

    參數 描述
    名稱 限制 變數的名稱
    型別 整數 變數的資料類型
    ReplTest1 0 變數的起始值

    螢幕擷取畫面顯示了 Azure 入口網站、工作流程設計工具,以及名為 [初始化變數] 的內建動作 (包含參數)。

  6. 在 [初始化變數] 動作下,遵循下列一般步驟,將名為 Until 的 [控制] 內建動作新增至您的取用標準邏輯應用程式工作流程。

  7. Until 動作中,提供下列值來設定迴圈的停止條件。

    1. 在 [Loop Until] 方塊內選取,然後選取閃電圖示以開啟動態內容清單。

    2. 從清單的 [變數] 底下,選取名為 Limit 的變數。

    3. 在 [計數] 底下,輸入 10 作為比較值。

    螢幕擷取畫面顯示了一個工作流程和名為 Until 的內建動作及所述值。

  8. Until 動作中,選取 [+>新增動作]。

  9. 遵循下列一般步驟,將名為 [遞增變數] 的 [變數] 內建動作新增至您的取用標準邏輯應用程式工作流程中的 Until 動作。

  10. 在 [遞增變數] 動作中,提供下列值,以將 Limit 變數的值遞增 1:

    參數
    限制 選取 Limit 變數。
    ReplTest1 1

    螢幕擷取畫面顯示了一個工作流程和名為 Until 的內建動作,其中「限制」設定為「限制變數」,並將「值」設定為 1。

  11. Until 動作外部和下方,遵循下列一般步驟,在您的取用標準邏輯應用程式工作流程中新增一個傳送電子郵件的動作。

    此範例會繼續進行名為傳送電子郵件Office 365 Outlook 動作。

  12. 在電子郵件動作中,提供下列值:

    參數 描述
    若要 < 電子郵件地址@domain> 收件者的電子郵件地址。 若要進行測試,請使用自己的電子郵件地址。
    主旨 "Limit" 變數的目前值為:Limit 電子郵件主旨。 針對此範例,請確定您包含 Limit 變數,以確認目前的值符合您的指定條件:

    1. 在 [主題] 方塊內選取,然後選取閃電圖。

    2. 從開啟的動態內容清單中,在 [變數] 區段標題旁,選取 [查看更多]

    3. 選取 [限制]
    本文 < 電子郵件內容> 您想要傳送的電子郵件訊息內容。 針對此範例,輸入任何您要的文字。

    完成時,您的電子郵件動作會類似下列範例:

    螢幕擷取畫面顯示了一個工作流程和名為 [傳送電子郵件] 的動作及屬性值。

  13. 儲存您的工作流程。

測試您的工作流程

若要手動測試您的邏輯應用程式工作流程:

  • 在設計工具列上,從 [執行] 選項中選取 [執行]

當您的工作流程開始執行之後,您會收到電子郵件及您指定的內容:

顯示從範例工作流程接收到範例電子郵件的螢幕擷取畫面。

避免無止盡的迴圈

Until 動作會根據選用的 CountTimeout 參數來停止執行。 請確定您已據以設定這些參數值:

參數 描述
Count 迴圈結束前可執行的反覆運算數目上限。

如需工作流程可擁有的 Until 動作數目的預設值和上限,請參閱並行、迴圈和解除批次處理限制
逾時 Until 動作,包括所有反覆運算,在迴圈結束之前執行的時間上限。 此值是以 ISO 8601 格式指定,而且會使用 For each 反覆運算進行評估。

如果迴圈中有任何動作所花費的時間超過逾時限制,目前的反覆運算並不會停止。 不過,下一個反覆運算不會開始,因為符合逾時限制條件。

如需逾時值的預設值和上限,請參閱並行、迴圈和解除批次處理限制.

"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 時,迴圈就會停止。 若要避免無止盡迴圈,迴圈也會在達到下列任一條件時停止:

  • 迴圈已依 count 屬性所指定的值執行了 10 次。 預設值為 60 次。

  • 迴圈已依 timeout 屬性所指定的值 (ISO 8601 格式) 執行了兩個小時。 預設值是一小時。

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