分享方式:


使用 Azure Logic Apps 的工作流程內嵌新增並執行 JavaScript 程式碼

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

若要在 Azure Logic Apps 中與工作流程內嵌執行自訂整合工作,您可以直接從 Azure 入口網站中的工作流程新增並執行簡單的 JavaScript 程式碼片段。 針對這項工作,請使用名為執行 JavaScript 程式碼內嵌程式碼動作。 此動作可從程式碼片段傳回結果,讓您可以在工作流程的後續動作中使用該輸出。 此動作也有不同的限制,根據您是否有使用量或標準工作流程,最適合具有下列屬性的程式碼片段:

動作 語言 Language version (語言版本) 執行持續時間 資料大小 訂單備註
執行 JavaScript 程式碼 JavaScript 標準
Node.js 16.x.x

耗用量
Node.js 8.11.1

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

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

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

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

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

必要條件

新增執行 JavaScript 程式碼動作

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

  2. 在設計工具中,遵循這些一般步驟以將名為執行 JavaScript 指令碼程式碼內嵌程式碼動作新增至您的工作流程 (部分機器翻譯)。

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

    螢幕擷取畫面,其中顯示具有預設範例程式碼的 [執行 JavaScript 程式碼] 動作。

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

    提示

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

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

    螢幕擷取畫面,其中顯示使用量工作流程、[執行 JavaScript 程式碼] 動作和關鍵字自動完成清單。

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

    螢幕擷取畫面,其中顯示使用量工作流程、[執行 JavaScript 程式碼] 動作,以及可建立變數的範例程式碼。

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

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

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

    選取 [內文] 屬性之後,[執行 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 程式碼] 動作,以及具有結尾分號的已重新命名 [內文] 屬性。

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

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

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

  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()
      }
   }
}

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

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

動作的名稱會使用基礎工作流程定義中所出現的相同動作名稱,但將動作名稱中的空格 (" ") 取代為底線 (_)。 此物件集合可讓您從目前的工作流程執行個體執行中存取動作的屬性值。
trigger Object 來自觸發程序的結果物件,其中結果相當於呼叫 trigger() 函數。 此物件可讓您從目前的工作流程執行個體執行中存取觸發程序的屬性值。
workflow Object 相當於呼叫 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 程式碼] 動作的明確相依性。 另一個需要您採取此步驟的案例是 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 程式碼動作

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

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

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

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

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

    螢幕擷取畫面,其中顯示 [動作項目 - 1] 方塊以及動作的 JSON 名稱。

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

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

動作參考

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

下一步