適用於:Azure Logic Apps (使用量 + 標準)
若要在邏輯應用程式工作流程中重複動作,您可以根據您的案例的需求,將 For each 迴圈或 Until 迴圈新增至您的工作流程。
附註
尋找有關迴圈的 Power Automate 文件嗎? 請參閱使用迴圈。
根據您的使用案例,您可以選擇下列類型的循環動作:
若要對數位或集合中的項目重複一或多個動作,請將 For each 動作 新增至您的工作流程。
或者,如果您有一個可以處理陣列的觸發程序,並且想要針對每個陣列項目執行一個工作流程執行個體,則可以透過設定 Split on 觸發程序屬性來對陣列進行拆批處理。
若要重複一或多個動作,直到符合條件或特定狀態變更為止,請將 Until 動作 新增至您的工作流程。
工作流程會先執行迴圈內的所有動作,然後檢查條件或狀態。 如果符合條件,則迴圈會停止。 否則,迴圈會重複。 如需工作流程可擁有的 Until 迴圈數目的預設值和上限,請參閱並行、迴圈和解除批次處理限制。
先決條件
Azure 帳戶和訂用帳戶。 如果您沒有訂用帳戶,請註冊一個免費的 Azure 帳戶。
您可以在其中建立和編輯工作流程的邏輯應用程式資源。 請參閱什麼是 Azure Logic Apps。
您想要在其中在迴圈中重複動作的邏輯應用程式資源和工作流程,以及啟動該工作流程的觸發程序。
在新增迴圈動作之前,您的工作流程必須先以觸發程序作為第一步。 如需詳細資訊,請參閱新增觸發程序或動作以建置工作流程。
下列步驟會使用 Azure 入口網站進行,但若搭配適當的 Azure Logic Apps 延伸模組,則也可以使用下列工具來建置邏輯應用程式工作流程:
- 取用工作流程:Visual Studio Code
- 標準工作流程:Visual Studio Code
根據您擁有的是「取用」工作流程還是「標準」工作流程,某些步驟會略有不同。
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 動作。
在 Azure 入口網站中,依指定順序執行下列步驟以建立邏輯應用工作流程:
遵循相同的一般步驟,在工作流程中的 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 動作中的反覆項目會同時平行執行。 不過,如果您有巢狀迴圈,或者在迴圈內有變數,並且您期望在其中獲得可預測的結果,則必須按順序逐一執行那些迴圈。
在設計工具上,選取 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 支援的任何電子郵件提供者。 如果您使用其他電子郵件帳戶,則一般步驟會保持不變,但看起來略有不同。
在 Azure 入口網站中,建立一個包含空白工作流程的邏輯應用資源。 請參閱先前的程序。
在 [定期] 觸發程序中,指定觸發程序引發的間隔、頻率和時間。
參數 值 間隔 1 頻率 Day 在這幾小時內 8 在這幾分鐘內 00 將頻率設定為天後,會顯示在這些小時和在這些分鐘。
當您完成時,定期觸發程序看起來類似下列範例:
在觸發程序下,遵循下列一般步驟,將名為 [初始化變數] 的 [變數] 內建動作新增至您的取用或標準邏輯應用程式工作流程。
在 [初始化變數] 動作中,提供下列值:
參數 值 描述 名稱 限制 變數的名稱 型別 整數 變數的資料類型 ReplTest1 0 變數的起始值 在 [初始化變數] 動作下,遵循下列一般步驟,將名為 Until 的 [控制] 內建動作新增至您的取用或標準邏輯應用程式工作流程。
在 Until 動作中,提供下列值來設定迴圈的停止條件。
在 [Loop Until] 方塊內選取,然後選取閃電圖示以開啟動態內容清單。
從清單的 [變數] 底下,選取名為 Limit 的變數。
在 [計數] 底下,輸入 10 作為比較值。
在 Until 動作中,選取 [+>新增動作]。
遵循下列一般步驟,將名為 [遞增變數] 的 [變數] 內建動作新增至您的取用或標準邏輯應用程式工作流程中的 Until 動作。
在 [遞增變數] 動作中,提供下列值,以將 Limit 變數的值遞增 1:
參數 值 限制 選取 Limit 變數。 ReplTest1 1 在 Until 動作外部和下方,遵循下列一般步驟,在您的取用或標準邏輯應用程式工作流程中新增一個傳送電子郵件的動作。
此範例會繼續進行名為傳送電子郵件的 Office 365 Outlook 動作。
在電子郵件動作中,提供下列值:
參數 值 描述 若要 < 電子郵件地址@domain> 收件者的電子郵件地址。 若要進行測試,請使用自己的電子郵件地址。 主旨 "Limit" 變數的目前值為:Limit 電子郵件主旨。 針對此範例,請確定您包含 Limit 變數,以確認目前的值符合您的指定條件:
1. 在 [主題] 方塊內選取,然後選取閃電圖。
2. 從開啟的動態內容清單中,在 [變數] 區段標題旁,選取 [查看更多]。
3. 選取 [限制]。本文 < 電子郵件內容> 您想要傳送的電子郵件訊息內容。 針對此範例,輸入任何您要的文字。 完成時,您的電子郵件動作會類似下列範例:
儲存您的工作流程。
測試您的工作流程
若要手動測試您的邏輯應用程式工作流程:
- 在設計工具列上,從 [執行] 選項中選取 [執行]。
當您的工作流程開始執行之後,您會收到電子郵件及您指定的內容:
避免無止盡的迴圈
Until 動作會根據選用的 Count 和 Timeout 參數來停止執行。 請確定您已據以設定這些參數值:
| 參數 | 描述 |
|---|---|
| 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": {}
}
}