在 Azure Logic Apps 中,根據群組狀態使用範圍執行動作
適用於:Azure Logic Apps (使用量)
若要在另一個群組成功或失敗之後才執行步驟,請將那些步驟群組在「範圍」中。 如果您想要將動作組織為邏輯群組、評估該群組的狀態,以及執行以範圍狀態為基礎的動作,此結構將會十分實用。 當範圍中的所有動作都執行完成之後,範圍也會取得自己的狀態。 例如,您可以在想要實作例外狀況和錯誤處理時使用範圍。
若要檢查範圍的狀態,您可以使用判斷邏輯應用程式執行狀態時所用的相同準則,例如「成功」、「失敗」、「取消」等。 根據預設,當範圍的所有動作都成功時,範圍的狀態會標示為「成功」。 但如果範圍中有任何動作失敗或取消,範圍的狀態會標示為「失敗」。 如需範圍的限制,請參閱限制和設定。
例如,以下高階邏輯應用程式會使用範圍來執行特定動作,以及使用條件來檢查範圍的狀態。 如果範圍內的任何動作失敗或非預期地結束,範圍會分別標示為「失敗」或「中止」,而邏輯應用程式會傳送「範圍失敗」的訊息。 如果範圍內的所有動作都成功,則邏輯應用程式會傳送「範圍成功」的訊息。
必要條件
若要遵循本文中的範例,您需要以下項目:
Azure 訂用帳戶。 如果您沒有訂用帳戶,請註冊一個免費的 Azure 帳戶。
電子郵件帳戶 (來自任何 Logic Apps 所支援的電子郵件提供者)。 此範例使用 Outlook.com。 如果您使用不同的提供者,一般流程維持不變,但您的 UI 會有所不同。
Bing 地圖金鑰。 若要取得此金鑰,請參閱取得 Bing 地圖金鑰。
邏輯應用程式的基本知識
建立範例邏輯應用程式
首先,建立此範例邏輯應用程式,以便您可以在稍後新增範圍:
- 排程 - 週期觸發程序,以您指定的時間間隔檢查 Bing 地圖服務
- Bing 地圖 - 取得路線動作,檢查兩個位置之間的旅行時間
- 條件動作,檢查旅遊時間是否超過指定的旅行時間
- 動作,傳送電子郵件給您,告知您目前的旅行時間超過指定的時間
您可以隨時儲存您的邏輯應用程式,所以請經常儲存您的工作。
請先登入 Azure 入口網站 (如果您尚未登入)。 建立空白邏輯應用程式。
使用下列設定新增排程 - 週期觸發程序:間隔 =「1」,以及頻率 =「分鐘」
提示
若要以視覺化方式來簡化您的檢視,並在設計工具中隱藏每個動作的詳細資料,請在進行這些步驟時摺疊每個動作圖形。
新增 [Bing 地圖 - 取得路線] 動作。
如果您尚未與 Bing 地圖連線,系統會要求您建立連線。
設定 值 Description 連線名稱 BingMapsConnection 為您的連線提供一個名稱。 API 金鑰 <your-Bing-Maps-key> 輸入您先前收到的 Bing 地圖服務金鑰。 設定 [取得路線] 動作,如下圖中的資料表所示:
如需這些參數的詳細資訊,請參閱計算路線。
設定 值 Description 導航點 1 <start> 輸入您的路線起點。 導航點 2 <end> 輸入您路線的目的地。 避免 無 輸入路線所要避開的項目,例如高速公路、收費站等等。 如需可能使用的值,請參閱計算路線。 最佳化 timeWithTraffic 選取可將路線最佳化的參數,例如距離、和使用目前交通資訊的時間等等。 此範例會使用此值:"timeWithTraffic" 距離單位 <your-preference> 輸入要計算您路線的距離單位。 此範例會使用此值:「英里」 行進模式 推動 輸入路線的旅行模式。 此範例會使用此值:「開車」 運輸日期時間 無 僅適用於運輸模式。 運輸日期類型 無 僅適用於運輸模式。
新增條件以檢查目前交通下的旅行時間是否超過指定時間。 針對此範例,請遵循下列步驟:
以此描述重新命名條件:如果交通時間超過指定時間
在最左邊的資料行中,選取 [選擇值] 方塊,即可顯示動態內容清單。 從清單中,選取 [旅行期間交通] 欄位 (以秒為單位)。
在中間的方塊中,選取此運算子:大於
在最右邊的資料行中輸入此比較值,也就是相當於 10 分鐘的秒數:600
當您完成時,您的條件看起來就像下面這個範例︰
在 [True] 分支中,新增適用於您電子郵件提供者的「傳送電子郵件」動作。 請遵循此影像下的步驟來設定此動作:
在 [收件者] 欄位中,輸入您的電子郵件地址以作為測試用。
在 [主旨] 欄位中,輸入下列文字:
Time to leave: Traffic more than 10 minutes
- 在 [內文] 欄位中,輸入此文字並加上尾端空格:
Travel time:
當您的游標出現在 [內文] 欄位時,動態內容清單會保持開啟狀態,因此您可以選取任何目前可用的參數。
在動態內容清單中,選取 [運算式]。
尋找並選取 div( ) 函式。 將游標置於函式的括號內。
當游標位於函式的括號內時,選取 [動態內容],動態內容清單會隨即顯示。
從 [取得路線] 區段中,選取 [旅行期間交通] 欄位。
在欄位解析成 JSON 格式之後,新增逗號 (
,
) 並在後方加上數字60
,讓旅行期間交通從以秒計算轉換為以分鐘計算。div(body('Get_route')?['travelDurationTraffic'],60)
您的運算式現在看起來就像下面這個範例︰
完成時,選取確定。
解析運算式之後,新增下列文字,並加上前置空格:
minutes
您的 [內文] 欄位現在看起來就像下面這個範例︰
儲存邏輯應用程式。
接下來,新增範圍,讓您可以群組特定動作,並評估其狀態。
新增範圍
如果您還沒在工作流程設計工具中開啟邏輯應用程式,請將其開啟。
在要使用的工作流程位置上新增範圍。 例如,若要在邏輯應用程式工作流程中的現有步驟之間新增範圍,請遵循下列步驟:
將指標停留在要新增範圍的箭號上方。 選取加號 (+) >[新增動作]。
在搜尋方塊中,輸入「範圍」作為篩選條件。 選取 [範圍] 動作。
將步驟新增至範圍
現在可新增步驟,或拖曳您想要在範圍內執行的現有步驟。 針對此範例,拖曳以下動作至範圍中:
- 取得路線
- 如果交通時間超過指定時間,其中需同時包含 true 和 false 分支
您的邏輯應用程式現在看起來就像下面這個範例︰
在範圍下,新增會檢查範圍狀態的條件。 以下列描述為條件重新命名:如果範圍失敗
在條件中新增這些運算式,以檢查範圍狀態是否等於「失敗」或「中止」。
若要新增另一個資料列,請選取 [新增]。
在每一列的左側方塊中選取,即會顯示動態內容清單。 從動態內容清單中,選取 [運算式]。 在 [編輯] 方塊中,輸入此運算式,然後選取 [確定]:
action('Scope')
針對這兩個資料列,選取 [等於] 作為運算子。
針對比較值,在第一列中輸入
Failed
。 在第二列中輸入Aborted
。當您完成時,您的條件看起來就像下面這個範例︰
現在,設定條件的
runAfter
屬性,使得條件會檢查範圍狀態,並執行後面步驟中定義的比對動作。在 [如果範圍失敗] 條件中,選取省略符號 (...) 按鈕,然後再選取 [設定執行後續動作]。
選取所有這些範圍狀態:成功、失敗、略過和逾時
完成之後,選取 [完成]。 條件現在會顯示「資訊」圖示。
在 [True] 和 [False] 的分支中,新增您想根據每個範圍狀態執行的動作,例如傳送電子郵件或訊息。
儲存邏輯應用程式。
已完成的邏輯應用程式現在看起來就像此範例︰
儲存您的工作
在設計工具的工具列上,選取 [執行]>[執行]。 如果範圍內的所有動作都成功,您會取得「範圍成功」的訊息。 如果範圍內有任何動作失敗,您會取得「範圍失敗」的訊息。
JSON 定義
如果您是在程式碼檢視中進行作業,您可以改為以邏輯應用程式的 JSON 定義來定義範圍結構。 例如,下列是前面邏輯應用程式中觸發程序和動作的 JSON 定義:
"triggers": {
"Recurrence": {
"type": "Recurrence",
"recurrence": {
"frequency": "Minute",
"interval": 1
}
}
}
"actions": {
"If_scope_failed": {
"type": "If",
"actions": {
"Scope_failed": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope failed. Scope status: @{action('Scope')}",
"Subject": "Scope failed",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"else": {
"actions": {
"Scope_succeeded": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope succeeded. Scope status: @{action('Scope')}",
"Subject": "Scope succeeded",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
}
},
"expression": {
"or": [
{
"equals": [
"@action('Scope')",
"Failed"
]
},
{
"equals": [
"@action('Scope')",
"Aborted"
]
}
]
},
"runAfter": {
"Scope": [
"Failed",
"Skipped",
"Succeeded",
"TimedOut"
]
}
},
"Scope": {
"type": "Scope",
"actions": {
"Get_route": {
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['bingmaps']['connectionId']"
}
},
"method": "get",
"path": "/REST/V1/Routes/Driving",
"queries": {
"distanceUnit": "Mile",
"optimize": "timeWithTraffic",
"travelMode": "Driving",
"wp.0": "<start>",
"wp.1": "<end>"
}
},
"runAfter": {}
},
"If_traffic_time_is_more_than_specified_time": {
"type": "If",
"actions": {
"Send_mail_when_traffic_exceeds_10_minutes": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Travel time:@{div(body('Get_route')?['travelDurationTraffic'],60)} minutes",
"Subject": "Time to leave: Traffic more than 10 minutes",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"expression": {
"and" : [
{
"greater": [
"@body('Get_route')?['travelDurationTraffic']",
600
]
}
]
},
"runAfter": {
"Get_route": [
"Succeeded"
]
}
}
},
"runAfter": {}
}
},