Azure Logic Apps でインライン コード操作を使用してワークフロー内でコード スニペットを実行する

適用対象: Azure Logic Apps (従量課金 + Standard)

多くのセットアップを行わずにロジック アプリ ワークフロー内でコード スニペットを作成して実行するには、インライン コードの組み込みコネクタを使用できます。 このコネクタは、コード スニペットから結果を返すアクションを備えており、ユーザーはワークフローの後続のアクションでその出力を使用できます。

現在、コネクタには、以下の属性を持つコード スニペットに対して最も効果的に動作する 1 つのアクションしかありませんが、さらに多くのアクションが開発中です。 また、インライン コード組み込みコネクタには、ロジック アプリ ワークフローが従量課金または Standard のいずれであるかに基づいて、異なる制限事項があります。

操作 言語 言語バージョン 実行継続時間 データ サイズ 他の注意事項
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 portal で、従量課金ロジック アプリのワークフローをデザイナーで開きます。

  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 コードの実行] アクションでは、[アクション] パラメータを追加して、これらのアクション名をそのパラメータに追加する必要があります。 詳細については、この記事で後述する「[JavaScript コードの実行] アクションに依存関係をパラメータとして追加する」を参照してください。

  5. 選択した電子メール メッセージの [本文] プロパティをトリガーの body プロパティから区別するには、2 番目の body プロパティの名前を代わりに Body に変更します。 終了セミコロン (;) を末尾に追加して、コード ステートメントを終了します。

    従量課金ロジック アプリ ワークフロー、[JavaScript コードの実行] アクション、[本文] プロパティの名前がセミコロンで閉じられ名前が変更された状態を示すスクリーンショット。

    [JavaScript コードの実行] アクションでは、return ステートメントは構文的に必要ありません。 ただし、return ステートメントを含めることにより、後のアクションで [結果] トークンを使用して、ワークフローの後半でアクションの結果をより簡単に参照できます。

    この例では、コード スニペットは、指定された正規表現に対する電子メール メッセージ本文内の一致を検索する match() 関数を呼び出して結果を返します。 続いて、[HTML テーブルの作成] アクションは [結果] トークンを使用して、[JavaScript コードの実行] アクションの結果を参照し、1 つの結果を作成します。

    従量課金ロジック アプリのワークフローの完了を示すスクリーンショット。

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

次の表は、これらのプロパティの詳細情報を示しています。

プロパティ Type 説明
actions オブジェクト コレクション コード スニペットを実行する前に実行した以前のアクションの結果オブジェクトです。 各オブジェクトには、"キーと値" のペアが含まれています。ここで、キーはアクション名、値は @actions('<action-name>') 式を含む actions() 関数の呼び出しの結果と同等です。

アクションの名前で使用されるアクション名は、基盤となるワークフロー定義に表示されるもの (アクション名内のスペース (" ") がアンダー スコア (_) で置き換えられています) と同じです。 このオブジェクト コレクションにより、現在実行されているワークフロー インスタンスからアクションのプロパティ値にアクセスできます。
trigger Object トリガーからの結果オブジェクト。結果は trigger() 関数の呼び出しと同等です。 このオブジェクトにより、現在実行されているワークフロー インスタンスからトリガーのプロパティ値にアクセスできます。
workflow Object workflow() 関数の呼び出しと同等のワークフロー オブジェクト。 このオブジェクトにより、現在実行されているワークフロー インスタンスからプロパティの値 (ワークフロー名や実行 ID など) にアクセスできます。

この記事の例では、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 コードの実行] アクションの明示的な依存関係として追加する必要があります。 このステップを実行する必要があるもう 1 つのシナリオとして、workflowContext オブジェクトがドット演算子 (.) を使用するトリガーまたはアクションの名前を参照する場合があります。

トリガーまたはアクションを依存関係として追加するには、[トリガー] または [アクション] パラメータを [JavaScript コードの実行] アクションに適宜追加します。 次に、トリガーまたはアクションの名前を、ワークフローの基盤となる JSON 定義に表示されるとおりに追加します。

注意

変数の操作、For eachUntil などのループ、反復インデックスを明示的な依存関係として追加することはできません。

コードを再利用する予定の場合は、必ずコード スニペットの編集ボックスを使用して、トリガーとアクションの出力を参照してください。 そうすることで、トリガーまたはアクションの出力を明示的な依存関係として単に追加するのではなく、解決されたトークン参照がコードに含まれるようになります。

たとえば、Office 365 Outlook コネクタの [承認の電子メールを送信します] アクションが、サンプル ワークフローのコード スニペットの前にあるとします。 次のコード スニペット例には、このアクションからの SelectedOption 出力への参照が含まれています。

この例では、[アクション] パラメーターのみ追加し、続いて、アクションの JSON 名 Send_approval_email をそのパラメーターに追加する必要があります。 そうすることで、[JavaScript コードの実行] アクションに [承認の電子メールを送信します] アクションからの出力が明示的に含まれるように指定します。

トリガーまたはアクションの JSON 名を検索する

開始する前に、基盤となるワークフロー定義のトリガーまたはアクションの JSON 名が必要になります。

  • ワークフロー定義の名前では、スペースではなく、アンダー スコア (_) が使用されます。

  • アクション名でドット演算子 (.) を使用する場合は、その演算子を含めます。次に例を示します。

    My.Action.Name

  1. ワークフロー デザイナーのツール バーで、[コード ビュー] を選択します。 actions オブジェクトで、アクションの名前を見つけます。

    たとえば、Send_approval_email は、Send_approval_email アクションの JSON 名です。

    JSON のアクション名を示すスクリーンショット。

  2. デザイナー ビューに戻るには、コード ビューのツールバー上で [デザイナー] を選択します。

  3. 次に、JSON 名を [JavaScript コードの実行] アクションに追加します。

トリガーまたはアクション名を [JavaScript コードの実行] アクションに追加する

  1. [JavaScript コードの実行] アクションで、[新しいパラメーターの追加] リストを開きます。

  2. パラメーターのリストから、シナリオに必要な次のパラメーターを選択します。

    パラメーター 説明
    アクション 以前のアクションからの出力を依存関係として含めます。 このパラメーターを選択した場合は、追加するアクションの入力を求められます。
    トリガー トリガーからの出力を依存関係として含めます。 このパラメーターを選択した場合は、トリガーの結果を含めるかどうかを尋ねられます。 その場合は、[トリガー] リストで [はい] を選択します。
  3. この例では、[アクション] パラメーターを選択します。

    [アクション] パラメータが選択された [JavaScript コードの実行] アクションを示すスクリーンショット。

  4. [Actions Item - 1] (アクション項目 - 1) ボックスにアクションの JSON 名を入力します。

    [アクション項目 -1] ボックスとアクションの JSON 名を示すスクリーンショット。

  5. 別のアクション名を追加するには、[新しい項目の追加] を選択します。

  6. 完了したら、ワークフローを保存します。

アクション リファレンス

ワークフロー定義言語を使用した基盤となるワークフロー定義での [JavaScript コードの実行] アクションの構造と構文の詳細については、このアクションのリファレンス セクションを参照してください。

次のステップ