在 Azure Logic Apps 中使用內嵌程式碼作業以在工作流程中執行程式碼片段

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

若要在邏輯應用程式工作流程中建立和執行程式碼片段,而不需要進行太多設定,您可以使用「內嵌程式碼」內建連接器。 此連接器有一個動作可從程式碼片段傳回結果,讓您可以在工作流程的後續動作中使用該輸出。

目前,連接器只有單一動作,其最適合具有下列屬性的程式碼片段,但還有更多動作正在開發中。 內嵌程式碼內建連接器也有不同的限制,取決於您的邏輯應用程式工作流程是取用或標準

動作 語言 語言版本 執行持續時間 資料大小 其他注意事項
執行 JavaScript 程式碼 JavaScript 標準
Node.js 16.x.x

耗用量
Node.js 8.11.1

如需詳細資訊,請檢閱標準內建物件
在 5 秒或更短的時間內完成。 最多處理 50 MB 的資料。 - 不需要使用動作未支援的變數動作

- 不支援用於執行 JavaScript 的 require() 函數。

若要執行不符合這些屬性的程式碼,您可以改為透過 Azure Functions 來建立和呼叫函數

本文顯示動作如何在以 Office 365 Outlook 觸發程序開始的範例工作流程中運作。 新的電子郵件送達相關聯的 Outlook 電子郵件帳戶時,會執行工作流程。 此範例程式碼片段會擷取任何存在於電子郵件內文的電子郵件地址,並將這些地址當成輸出傳回,而您可以在後續動作中使用此輸出。

下圖顯示範例工作流程的重點摘要:

必要條件

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

  • 您想要在其中新增程式碼片段的邏輯應用程式工作流程。 工作流程必須已使用觸發程序啟動。

    本文的範例使用名為 [收到新的電子郵件時] 的 Office 365 Outlook 觸發程序。

    如果您沒有工作流程,請參閱下列檔:

  • 根據您的邏輯應用程式是取用還是標準,檢閱下列需求:

    • 取用:需要從邏輯應用程式資源的 Node.js 8.11.10 版整合帳戶的連結、空白或其他項目。

      重要事項

      請確定您使用適合於使用案例或情節的企業整合帳戶。

      例如,免費層企業整合帳戶僅適用於探勘情節和工作負載 (而非生產情節)、這類帳戶使用量和輸送量有限,且服務等級協定 (SLA) 不支援這類帳戶。

      其他企業整合帳戶層會產生成本,但包含 SLA 支援、提供更多輸送量,並具有較高的限制。 深入了解整合帳戶層限制定價

    • 標準:需要 Node.js 16.x.x版,但不需要整合帳戶。

新增執行 JavaScript 程式碼動作

  1. Azure 入口網站中,在設計工具中開啟您的取用邏輯應用程式工作流程。

  2. 在設計工具中,遵循這些一般步驟,將名為Execute JavaScript Code內嵌程式碼動作新增至您的工作流程

    本範例會在 Office 365 Outlook 觸發程序底下新增動作。 根據預設,動作包含一些範例程式碼,包括 return 語句。

    顯示使用預設範例程式碼執行 JavaScript 程式碼動作的螢幕擷取畫面。

  3. 在 [程式碼] 方塊中,刪除範例程式碼,然後輸入程式碼。 撰寫您放在方法內但不含方法簽章的程式碼。

    秘訣

    當您的游標位於 [程式碼] 方塊中時,動態內容清單隨即出現。 雖然您稍後將會使用此清單,但現在可以忽略並讓清單保持開啟狀態。 請不要選取 [隱藏]。

    如果您開始輸入已辨識的關鍵字,就會顯示自動完成清單,以便從可用的關鍵字中選取,例如:

    顯示取用工作流程、執行 JavaScript 程式碼動作和關鍵字自動完成清單的螢幕擷取畫面。

    下列範例程式碼片段會先建立名為 myResult 的變數來儲存「規則運算式」,以指定要在輸入文字中比對的模式。 此程式碼接著會建立名為 email 的變數來儲存來自觸發程序輸出的電子郵件訊息內文內容。

    此螢幕擷取畫面顯示取用工作流程、執行 JavaScript 程式碼動作,以及建立變數的範例程式碼。

  4. 當您的游標仍在 [程式碼] 方塊中時,請從開啟的動態內容清單中找到 [收到新的電子郵件時] 區段,然後選取 [內文] 屬性,以參考電子郵件訊息內文。

    顯示已選取 [使用工作流程]、[執行 JavaScript 程式碼] 動作、動態內容清單和電子郵件訊息 [內文] 屬性的螢幕擷取畫面。

    觸發程序和任何先前動作的輸出符合目前聚焦編輯方塊的輸入格式時,動態內容清單會顯示這些輸出。 此清單可讓您更輕鬆地從工作流程使用和參考這些輸出。 在此範例中,此清單會顯示 Outlook 觸發程序的輸出,包括電子郵件訊息的 [內文] 屬性。

    選取 Body 屬性之後, [執行 JavaScript 程式碼 ] 動作會將權杖解析為唯讀 workflowContext JSON 物件,您的程式碼片段可用來做為輸入。 workflowContext 物件所含的屬性可讓您的程式碼存取工作流程中的觸發程序和先前動作的輸出,例如觸發程序的 body 屬性,而這與電子郵件訊息的 [內文] 屬性不同。 如需 workflowContext 物件的詳細資訊,請參閱本文稍後的使用 workflowContext 物件來參考觸發程序和動作輸出

    重要事項

    如果您的程式碼片段參考含有點 (.) 運算子的動作名稱,則這些參考必須以方括弧 ([]) 和引號 ("") 來括住這些動作名稱,例如:

    // Correct
    workflowContext.actions["my.action.name"].body

    // Incorrect
    workflowContext.actions.my.action.name.body

    此外,在 [執行 JavaScript 程式碼] 動作中,您必須新增Actions參數,然後將這些動作名稱新增至該參數。 如需詳細資訊,請參閱本文稍後的 將相依性新增為參數至執行 JavaScript 程式碼動作

  5. 若要區分您從觸發程序 body 屬性選取的電子郵件訊息 [內文] 屬性,請改為將第二個 body 屬性重新命名為 Body。 在結尾新增結尾分號 (;),以完成程式碼陳述式。

    此螢幕擷取畫面顯示取用邏輯應用程式工作流程、執行 JavaScript 程式碼動作,以及已使用右分號重新命名 「Body」 屬性。

    執行 JavaScript 程式碼動作不需要語句 return 。 不過,包括 return 陳述式,即可在稍後的動作中使用[結果] 權杖,以稍後在工作流程中更輕鬆地參考動作結果。

    在此範例中,程式碼片段會呼叫 match() 函數來傳回結果,而此函數會在電子郵件移轉內文中尋找所指定規則運算式的相符項目。 然後 ,建立 HTML 資料表 動作會使用 Result 權杖來參考 執行 JavaScript Code 動作的結果,並建立單一結果。

    螢幕擷取畫面,其中顯示已完成的取用邏輯應用程式工作流程。

  6. 完成後,請儲存您的工作流程。

使用 workflowContext 物件來參考觸發程序和動作輸出

從設計工具上的程式碼片段內,您可以使用動態內容清單來選取可參考觸發程序或任何先前動作輸出的權杖。 當您選取權杖時, [執行 JavaScript 程式碼 ] 動作會將該權杖解析為唯讀 workflowContext JSON 物件。 此物件可讓您的程式碼存取觸發程序、任何先前動作和工作流程的輸出。 此物件會使用下列結構,並包括 actionstriggerworkflow 屬性,而這些屬性也是物件:

{
   "workflowContext": {
      "actions": {
         "<action-name-1>": @actions('<action-name-1>'),
         "<action-name-2>": @actions('<action-name-2>')
      },
      "trigger": {
         @trigger()
      },
      "workflow": {
         @workflow()
      }
   }
}

下表具有這些屬性的詳細資訊:

屬性 類型 Description
actions 物件集合 來自程式碼片段執行之前所執行先前動作的結果物件。 每個物件都會有「索引鍵值」組,其中索引鍵是動作的名稱,而值相當於使用 @actions('<action-name>') 運算式呼叫 actions() 函數的結果。

動作的名稱會使用基礎工作流程定義中所出現的相同動作名稱,但將動作名稱中的空格 (" ") 取代為底線 (_)。 此物件集合可讓您從目前的工作流程執行個體執行中存取動作的屬性值。
trigger 物件 來自觸發程序的結果物件,其中結果相當於呼叫 trigger() 函數。 此物件可讓您從目前的工作流程執行個體執行中存取觸發程序的屬性值。
workflow 物件 相當於呼叫 workflow() 函數的工作流程物件。 此物件可讓您從目前的工作流程執行個體執行中存取屬性值,例如工作流程名稱、執行識別碼等等。

在本文的範例中,workflowContext JSON 物件可能具有 Outlook 觸發程序的下列範例屬性和值:

{
   "workflowContext": {
      "trigger": {
         "name": "When_a_new_email_arrives",
         "inputs": {
            "host": {
               "connection": {
                  "name": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Web/connections/office365"
               }
            },
            "method": "get",
            "path": "/Mail/OnNewEmail",
            "queries": {
               "includeAttachments": "False"
            }
         },
         "outputs": {
            "headers": {
               "Pragma": "no-cache",
               "Content-Type": "application/json; charset=utf-8",
               "Expires": "-1",
               "Content-Length": "962095"
            },
            "body": {
               "Id": "AAMkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgBGAAAAAABmZwxUQtCGTqSPpjjMQeD",
               "DateTimeReceived": "2019-03-28T19:42:16+00:00",
               "HasAttachment": false,
               "Subject": "Hello World",
               "BodyPreview": "Hello World",
               "Importance": 1,
               "ConversationId": "AAQkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgAQ",
               "IsRead": false,
               "IsHtml": true,
               "Body": "Hello World",
               "From": "<sender>@<domain>.com",
               "To": "<recipient-2>@<domain>.com;<recipient-2>@<domain>.com",
               "Cc": null,
               "Bcc": null,
               "Attachments": []
            }
         },
         "startTime": "2019-05-03T14:30:45.971564Z",
         "endTime": "2019-05-03T14:30:50.1746874Z",
         "scheduledTime": "2019-05-03T14:30:45.8778117Z",
         "trackingId": "1cd5ffbd-f989-4df5-a96a-6e9ce31d03c5",
         "clientTrackingId": "08586447130394969981639729333CU06",
         "originHistoryName": "08586447130394969981639729333CU06",
         "code": "OK",
         "status": "Succeeded"
      },
      "workflow": {
         "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>",
         "name": "<logic-app-workflow-name>",
         "type": "Microsoft.Logic/workflows",
         "location": "<Azure-region>",
         "run": {
            "id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>/runs/08586453954668694173655267965CU00",
            "name": "08586453954668694173655267965CU00",
            "type": "Microsoft.Logic/workflows/runs"
         }
      }
   }
}

將相依性新增為執行 JavaScript 程式碼動作的參數

在某些情況下,您可能必須明確要求 「執行 JavaScript 程式碼 」動作包含程式碼所參考相依性之觸發程式或動作的輸出。 例如,當您的程式碼參考工作流程執行階段無法使用的輸出時,您必須採取這個額外步驟。 在工作流程建立期間,Azure Logic Apps 引擎會分析程式碼片段,以判斷程式碼是否參考任何觸發程序或動作輸出。 如果這些參考存在,則引擎會自動包括這些輸出。 在工作流程執行階段,如果在 workflowContext 物件中找不到參考的觸發程序或動作輸出,則引擎會產生錯誤。 若要解決此錯誤,您必須將該觸發程式或動作新增為 執行 JavaScript Code 動作的明確相依性。 另一個需要您採取此步驟的案例是 workflowContext 物件參考可使用點運算子 (.) 的觸發程序或動作名稱時。

若要將觸發程式或動作新增為相依性,您可以新增適用于執行 JavaScript 程式碼動作的觸發程式或動作參數。 接著,您會新增出現在工作流程基礎 JSON 定義中的觸發程序或動作名稱。

注意

您無法新增「變數」作業、迴圈 (例如 For eachUntil) 以及反覆運算索引作為明確相依性。

如果您打算重複使用程式碼,則請務必一律使用程式碼片段編輯方塊來參考觸發程序和動作輸出。 如此一來,您的程式碼就會包括已解析的權杖參考,而不只是將觸發程序或動作輸出新增為明確相依性。

例如,假設 Office 365 Outlook 連接器的 [傳送核准電子郵件] 動作在範例工作流程中的程式碼片段之前。 下列範例程式碼片段包括此動作中 SelectedOption 輸出的參考。

在此範例中,您必須只新增「動作」參數,然後將動作的 JSON 名稱 Send_approval_email 新增至參數。 如此一來,您會指定 [執行 JavaScript 程式碼 ] 動作明確包含 [ 傳送核准電子郵件 ] 動作的輸出。

尋找觸發程序或動作的 JSON 名稱

開始之前,您需要基礎工作流程定義中觸發程序或動作的 JSON 名稱。

  • 工作流程定義中的名稱會使用底線 (_),而不是空格。

  • 如果動作名稱使用點運算子 (.),則請包括該運算子,例如:

    My.Action.Name

  1. 在工作流程設計工具的工具列上,選取 [程式碼檢視]。 在 actions 物件中,尋找動作的名稱。

    例如,Send_approval_email 是 [傳送核准電子郵件] 動作的 JSON 名稱。

    螢幕擷取畫面,其中顯示 JSON 中的動作名稱。

  2. 若要返回設計工具檢視,請在程式碼檢視工具列上選取 [設計工具]。

  3. 現在,將 JSON 名稱新增至 執行 JavaScript 程式碼 動作。

將觸發程式或動作名稱新增至執行 JavaScript Code 動作

  1. 在 [ 執行 JavaScript 程式碼 ] 動作中,開啟 [ 新增參數 ] 清單。

  2. 從參數清單中,選取下列參數,因為您的案例需要。

    參數 Description
    動作 包括先前動作的輸出作為相依性。 當您選取此參數時,系統會提示您輸入要新增的動作。
    觸發程序 包括觸發程序的輸出作為相依性。 當您選取此參數時,系統會提示您是否要包括觸發程序結果。 因此,從 [觸發程序] 清單中,選取 [是]。
  3. 在此範例中,選取「動作」參數。

    顯示執行 JavaScript 程式碼動作的螢幕擷取畫面,其中已選取 Actions 參數。

  4. 在 [動作項目 - 1] 方塊中,輸入動作的 JSON 名稱。

    顯示 [動作專案 -1] 方塊和動作 JSON 名稱的螢幕擷取畫面。

  5. 若要新增另一個動作名稱,請選取 [新增項目]。

  6. 完成後,請儲存您的工作流程。

動作參考

如需使用工作流程定義語言在基礎工作流程定義中「執行 JavaScript 程式碼」動作的結構和語法的詳細資訊,請參閱此動作的參考一節

下一步