共用方式為


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

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

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

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

取用
Node.js 8.11.1

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

- 不支援執行 JavaScript 的 require() 函式。

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

本指南說明動作如何在以 Office 365 Outlook 觸發程式開頭的範例工作流程中運作。 當新電子郵件送達相關聯的 Outlook 電子郵件帳戶時,工作流程就會執行。 範例代碼段會擷取存在於電子郵件本文的任何電子郵件位址,並傳回這些地址作為您可以在後續動作中使用的輸出。

下圖顯示範例工作流程的醒目提示:

必要條件

新增執行 JavaScript 程式代碼動作

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

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

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

    顯示使用預設範例程式代碼執行 JavaScript 程式代碼動作的螢幕快照。

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

    提示

    當您的資料指標位於 [ 程序代碼 ] 方塊中時,動態內容清單隨即出現。 雖然您稍後會使用此清單,但您可以忽略清單,並讓清單暫時保持開啟狀態。 請勿選取 [ 隱藏]。

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

    顯示取用工作流程、執行 JavaScript 程式代碼動作和關鍵詞自動完成清單的螢幕快照。

    下列範例代碼段會先建立名為 myResult變數,以儲存正則表達式,以指定要在輸入文字中比對的模式。 然後,程式代碼會建立名為 email 的變數,以從觸發程式輸出儲存電子郵件訊息的本文內容。

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

  4. 使用游標仍位於 [程序代碼] 方塊中,從開啟的動態內容清單中,尋找 [新電子郵件送達時] 區段,然後選取 [本文] 屬性,以參考電子郵件訊息的本文。

    此螢幕快照顯示已選取 [使用工作流程]、[執行 JavaScript 程式代碼] 動作、動態內容清單,以及電子郵件訊息的 [本文] 屬性。

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

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

    重要

    如果您的代碼段參考包含點 (.) 運算子的動作名稱,這些參考必須以方括弧 ([]) 和引號 (“”) 括住這些動作名稱,例如:

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

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

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

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

    顯示取用邏輯應用程式工作流程、執行 JavaScript 程式代碼動作,以及以結尾分號重新命名 「Body」 屬性的螢幕快照。

    執行 JavaScript 程式代碼 動作不需要 return 語句。 不過,藉由包含 return 語句,您可以在稍後的動作中使用結果令牌,更輕鬆地在工作流程中參考動作結果。

    在此範例中,代碼段會藉由呼叫 match() 函式來傳回結果,該函式會在電子郵件訊息本文中尋找任何相符專案至指定的正則表達式。 接著,建立 HTML 數據表動作會使用 Result 令牌來參考 Execute JavaScript Code 動作的結果,並建立單一結果。

    顯示已完成取用邏輯應用程式工作流程的螢幕快照。

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

使用 workflowContext 對象參考觸發程式和動作輸出

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

{
   "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 輸出的參考。

在此範例中,您必須只 新增 Actions 參數,然後將動作的 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. 在此範例中 ,選取 Actions 參數。

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

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

    顯示 [動作專案 -1] 方塊和動作 JSON 名稱的螢幕快照。

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

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

動作參考

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

下一步