分享方式:


在 Azure Logic Apps 中,根據群組狀態使用範圍執行動作

適用於:Azure Logic Apps (使用量)

若要在另一個群組成功或失敗之後才執行步驟,請將那些步驟群組在「範圍」中。 如果您想要將動作組織為邏輯群組、評估該群組的狀態,以及執行以範圍狀態為基礎的動作,此結構將會十分實用。 當範圍中的所有動作都執行完成之後,範圍也會取得自己的狀態。 例如,您可以在想要實作例外狀況和錯誤處理時使用範圍。

若要檢查範圍的狀態,您可以使用判斷邏輯應用程式執行狀態時所用的相同準則,例如「成功」、「失敗」、「取消」等。 根據預設,當範圍的所有動作都成功時,範圍的狀態會標示為「成功」。 但如果範圍中有任何動作失敗或取消,範圍的狀態會標示為「失敗」。 如需範圍的限制,請參閱限制和設定

例如,以下高階邏輯應用程式會使用範圍來執行特定動作,以及使用條件來檢查範圍的狀態。 如果範圍內的任何動作失敗或非預期地結束,範圍會分別標示為「失敗」或「中止」,而邏輯應用程式會傳送「範圍失敗」的訊息。 如果範圍內的所有動作都成功,則邏輯應用程式會傳送「範圍成功」的訊息。

圖表顯示邏輯應用程式範圍流程,內有範例「範圍失敗」和「範圍成功」。

必要條件

若要遵循本文中的範例,您需要以下項目:

  • Azure 訂用帳戶。 如果您沒有訂用帳戶,請註冊一個免費的 Azure 帳戶

  • 電子郵件帳戶 (來自任何 Logic Apps 所支援的電子郵件提供者)。 此範例使用 Outlook.com。 如果您使用不同的提供者,一般流程維持不變,但您的 UI 會有所不同。

  • Bing 地圖金鑰。 若要取得此金鑰,請參閱取得 Bing 地圖金鑰

  • 邏輯應用程式的基本知識

建立範例邏輯應用程式

首先,建立此範例邏輯應用程式,以便您可以在稍後新增範圍:

建立範例邏輯應用程式

  • 排程 - 週期觸發程序,以您指定的時間間隔檢查 Bing 地圖服務
  • Bing 地圖 - 取得路線動作,檢查兩個位置之間的旅行時間
  • 條件動作,檢查旅遊時間是否超過指定的旅行時間
  • 動作,傳送電子郵件給您,告知您目前的旅行時間超過指定的時間

您可以隨時儲存您的邏輯應用程式,所以請經常儲存您的工作。

  1. 請先登入 Azure 入口網站 (如果您尚未登入)。 建立空白邏輯應用程式。

  2. 使用下列設定新增排程 - 週期觸發程序:間隔 =「1」,以及頻率 =「分鐘」

    設定「排程 - 週期」觸發程序

    提示

    若要以視覺化方式來簡化您的檢視,並在設計工具中隱藏每個動作的詳細資料,請在進行這些步驟時摺疊每個動作圖形。

  3. 新增 [Bing 地圖 - 取得路線] 動作。

    1. 如果您尚未與 Bing 地圖連線,系統會要求您建立連線。

      設定 Description
      連線名稱 BingMapsConnection 為您的連線提供一個名稱。
      API 金鑰 <your-Bing-Maps-key> 輸入您先前收到的 Bing 地圖服務金鑰。
    2. 設定 [取得路線] 動作,如下圖中的資料表所示:

      設定 [Bing 地圖服務 - 取得路線] 動作

      如需這些參數的詳細資訊,請參閱計算路線

      設定 Description
      導航點 1 <start> 輸入您的路線起點。
      導航點 2 <end> 輸入您路線的目的地。
      避免 輸入路線所要避開的項目,例如高速公路、收費站等等。 如需可能使用的值,請參閱計算路線
      最佳化 timeWithTraffic 選取可將路線最佳化的參數,例如距離、和使用目前交通資訊的時間等等。 此範例會使用此值:"timeWithTraffic"
      距離單位 <your-preference> 輸入要計算您路線的距離單位。 此範例會使用此值:「英里」
      行進模式 推動 輸入路線的旅行模式。 此範例會使用此值:「開車」
      運輸日期時間 僅適用於運輸模式。
      運輸日期類型 僅適用於運輸模式。
  4. 新增條件以檢查目前交通下的旅行時間是否超過指定時間。 針對此範例,請遵循下列步驟:

    1. 以此描述重新命名條件:如果交通時間超過指定時間

    2. 在最左邊的資料行中,選取 [選擇值] 方塊,即可顯示動態內容清單。 從清單中,選取 [旅行期間交通] 欄位 (以秒為單位)。

      建置條件

    3. 在中間的方塊中,選取此運算子:大於

    4. 在最右邊的資料行中輸入此比較值,也就是相當於 10 分鐘的秒數:600

      當您完成時,您的條件看起來就像下面這個範例︰

      已完成的條件

  5. 在 [True] 分支中,新增適用於您電子郵件提供者的「傳送電子郵件」動作。 請遵循此影像下的步驟來設定此動作:

    將「傳送電子郵件」動作新增至「True」分支

    1. 在 [收件者] 欄位中,輸入您的電子郵件地址以作為測試用。

    2. 在 [主旨] 欄位中,輸入下列文字:

    Time to leave: Traffic more than 10 minutes

    1. 在 [內文] 欄位中,輸入此文字並加上尾端空格:

    Travel time:

    當您的游標出現在 [內文] 欄位時,動態內容清單會保持開啟狀態,因此您可以選取任何目前可用的參數。

    1. 在動態內容清單中,選取 [運算式]

    2. 尋找並選取 div( ) 函式。 將游標置於函式的括號內。

    3. 當游標位於函式的括號內時,選取 [動態內容],動態內容清單會隨即顯示。

    4. 從 [取得路線] 區段中,選取 [旅行期間交通] 欄位。

      選取 [旅行期間交通] 欄位

    5. 在欄位解析成 JSON 格式之後,新增逗號 (,) 並在後方加上數字 60,讓旅行期間交通從以秒計算轉換為以分鐘計算。

      div(body('Get_route')?['travelDurationTraffic'],60)
      

      您的運算式現在看起來就像下面這個範例︰

      完成運算式

    6. 完成時,選取確定

    1. 解析運算式之後,新增下列文字,並加上前置空格: minutes

      您的 [內文] 欄位現在看起來就像下面這個範例︰

      完成的 [內文] 欄位

  6. 儲存邏輯應用程式。

接下來,新增範圍,讓您可以群組特定動作,並評估其狀態。

新增範圍

  1. 如果您還沒在工作流程設計工具中開啟邏輯應用程式,請將其開啟。

  2. 在要使用的工作流程位置上新增範圍。 例如,若要在邏輯應用程式工作流程中的現有步驟之間新增範圍,請遵循下列步驟:

    1. 將指標停留在要新增範圍的箭號上方。 選取加號 (+) >[新增動作]

      新增範圍

    2. 在搜尋方塊中,輸入「範圍」作為篩選條件。 選取 [範圍] 動作。

將步驟新增至範圍

  1. 現在可新增步驟,或拖曳您想要在範圍內執行的現有步驟。 針對此範例,拖曳以下動作至範圍中:

    • 取得路線
    • 如果交通時間超過指定時間,其中需同時包含 truefalse 分支

    您的邏輯應用程式現在看起來就像下面這個範例︰

    新增的範圍

  2. 在範圍下,新增會檢查範圍狀態的條件。 以下列描述為條件重新命名:如果範圍失敗

    新增條件來檢查範圍狀態

  3. 在條件中新增這些運算式,以檢查範圍狀態是否等於「失敗」或「中止」。

    1. 若要新增另一個資料列,請選取 [新增]

    2. 在每一列的左側方塊中選取,即會顯示動態內容清單。 從動態內容清單中,選取 [運算式]。 在 [編輯] 方塊中,輸入此運算式,然後選取 [確定]

      action('Scope')

      顯示 [運算式] 方塊的螢幕擷取畫面,其中結果運算式已醒目提示。

    3. 針對這兩個資料列,選取 [等於] 作為運算子。

    4. 針對比較值,在第一列中輸入 Failed。 在第二列中輸入 Aborted

      當您完成時,您的條件看起來就像下面這個範例︰

      新增會檢查範圍狀態的運算式

      現在,設定條件的 runAfter 屬性,使得條件會檢查範圍狀態,並執行後面步驟中定義的比對動作。

    5. 在 [如果範圍失敗] 條件中,選取省略符號 (...) 按鈕,然後再選取 [設定執行後續動作]

      設定 runAfter 屬性

    6. 選取所有這些範圍狀態:成功失敗略過逾時

      選取範圍狀態

    7. 完成之後,選取 [完成]。 條件現在會顯示「資訊」圖示。

  4. 在 [True] 和 [False] 的分支中,新增您想根據每個範圍狀態執行的動作,例如傳送電子郵件或訊息。

    新增要根據範圍狀態採取的動作

  5. 儲存邏輯應用程式。

已完成的邏輯應用程式現在看起來就像此範例︰

具有範圍的已完成邏輯應用程式

儲存您的工作

在設計工具的工具列上,選取 [執行]>[執行]。 如果範圍內的所有動作都成功,您會取得「範圍成功」的訊息。 如果範圍內有任何動作失敗,您會取得「範圍失敗」的訊息。

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

下一步