Google スプレッドシートからワークフローをトリガーする

Google スプレッドシートは、リアルタイムでの共同編集が可能な、データの可視化、処理、通信のためのツールを提供するクラウドベースのスプレッドシート ソリューションです。

このチュートリアルでは、スプレッドシートから Workflows をトリガーする方法について説明します。

VM インスタンスをリクエストするフォームを作成する

Compute Engine 仮想マシン(VM)インスタンスの作成リクエストを送信するために使用できるフォームを作成します。デフォルトでは、Google フォームで作成したフォームは Google ドライブに保存されます。

  1. forms.google.com にアクセスします。
  2. 空白Plus をクリックします。

    新しいフォームが開きます。

  3. 5 つの必須セクションを含むフォームを作成します。フォームは次のようになります。

    サンプル フォームを表示する

    Google Cloud 仮想マシンの作成をリクエストするフォームの例
    マシン名

    記述式テキスト(短文回答)

    ゾーン

    (プルダウン)

    1. us-central1-a
    2. us-central1-b
    3. us-central1-c
    4. us-central1-f

    (プルダウン)

    1. e2-micro
    2. e2-small
    3. e2-medium
    4. e2-standard-2
    5. e2-standard-4
    Disk size (GB)

    記述式テキスト(短文回答)

    OS

    (プルダウン)

    1. debian-10
    2. centos-stream-9
    3. cos-93-lts
    4. cos-97-lts
  4. フォームの回答者のメールアドレスを記録するには、メールアドレスの収集を有効にします。
    1. [設定] をクリックします。
    2. [回答] セクションを開きます。
    3. [メールアドレスを収集する] をオンにします。

フォームを作成したら、スプレッドシートをリンクして、フォームの回答をそのスプレッドシートに保存できるようにします。スプレッドシートは ドライブに保存されます。

  1. Google フォームでフォームを開きます。
  2. [回答] をクリックします。
  3. [Google スプレッドシートにリンク] をクリックします。
  4. [回答の送信先を選択] ダイアログで、[新しいスプレッドシートを作成] を選択します。
  5. [作成] をクリックします。

    リンクされたスプレッドシートが開きます。

  6. 列 [H] に、[承認済みか?] 見出しを追加します。

  7. 列 [H] の最初の行にカーソルを合わせ、[挿入] > [チェックボックス] を選択します。

    スプレッドシートは次のようになります。

    リクエストを収集するためにリンクされたスプレッドシートの例

    回答でシートが更新されるたびに、その回答の行にもこのチェックボックスが表示されます。

Apps Script を使用して Google スプレッドシートを拡張する

Apps Script を使用すると、Google スプレッドシートの作成、読み取り、編集をプログラムで行うことができます。Google スプレッドシート用に設計されたほとんどのスクリプトでは、配列を操作してスプレッドシート内のセル、行、列を操作することができます。Google スプレッドシートで Apps Script を使用する方法については、カスタム関数のクイックスタートをご覧ください。

  1. Google スプレッドシートから Apps Script プロジェクトを作成する:

    1. Google スプレッドシートを開きます。
    2. [拡張機能] > [Apps Script] を選択します。
    3. スクリプト エディタで、[無題のプロジェクト] をクリックします。
    4. プロジェクトに名前を付けて、[名前を変更する] をクリックします。

    これで、スクリプトがスプレッドシートにバインドされます。これにより、スクリプトでユーザー インターフェースを変更したり、スプレッドシートを開いたときに応答したりできます。

    スクリプト プロジェクトは、Apps Script のファイルとリソースのコレクションを表します。スクリプト プロジェクトのコードファイルの拡張子は .gs です。

  2. Apps Script を使用すると、組み込み関数のように Google スプレッドシートで使用できるカスタム関数を作成できます。カスタム関数は、標準の JavaScript を使用して作成されます。関数を作成する

    1. Apps Script プロジェクトを開きます。
    2. [編集者] をクリックします。
    3. スクリプト ファイルは、Code.gs という名前のプロジェクト ファイルとして表示されます。ファイルを編集するには、そのファイルを選択します。
    4. スクリプト エディタのコードを次のコードに置き換えます。このコードは、スプレッドシート内のデータを読み取り、ワークフロー実行への入力として渡します。

      const PROJECT_ID = "your-project-id";
      const REGION = "us-central1";
      const WORKFLOW = "create-vm-from-form";
      
      function handleEdit(e) {
        var range = e.range.getA1Notation();
        var sheet = e.source;
      
        if (range.length > 1 && range[0] === 'H') {
          if (e.value == "TRUE") {
            Logger.log("Approved checkbox: true");
      
            var row = range.slice(1)
            var email = sheet.getRange('B' + row).getCell(1, 1).getValue()
            var vmName = sheet.getRange('c' + row).getCell(1, 1).getValue()
            var zone = sheet.getRange('D' + row).getCell(1, 1).getValue()
            var machineType = sheet.getRange('E' + row).getCell(1, 1).getValue()
            var diskSize = sheet.getRange('F' + row).getCell(1, 1).getValue()
            var imageFamily = sheet.getRange('G' + row).getCell(1, 1).getValue()
            var imageProject = imageFamily.substring(0, imageFamily.indexOf('-')) + "-cloud"
      
            const executionPayload = {
              "argument": "{\"diskSize\": \"" + diskSize + "\", \"email\": \"" + email + "\", \"imageFamily\": \"" + imageFamily + "\", \"imageProject\": \"" + imageProject + "\", \"machineType\": \"" + machineType + "\", \"vmName\": \"" + vmName + "\", \"zone\": \"" + zone +  "\"}"
            };
      
            approve(executionPayload);
          }
          else {
            Logger.log("Approved checkbox: false");
          }
        }
      }
      
      function approve(executionPayload) {
        const headers = {
          "Authorization": "Bearer " + ScriptApp.getOAuthToken()
        };
      
        const params = {
          "method": 'post',
          "contentType": 'application/json',
          "headers": headers,
          "payload": JSON.stringify(executionPayload)
        };
      
        const url = "https://workflowexecutions.googleapis.com/v1/projects/" + PROJECT_ID + "/locations/" + REGION + "/workflows/" + WORKFLOW + "/executions";
      
        Logger.log("Workflow execution request to " + url);
        var response = UrlFetchApp.fetch(url, params);
        Logger.log(response);
      }
    5. your-project-id は、実際の Google Cloud プロジェクト ID に置き換えます。

      プロジェクト ID は、 Google Cloud コンソールの [ようこそ] ページで確認できます。

    6. [保存] をクリックします。

  3. Apps Script のインストール可能なトリガーを使用すると、スプレッドシートを開いたり編集したりしたときなど、特定の条件が満たされたときに、スクリプト プロジェクトが指定された関数を実行できるようになります。トリガーを作成する

    1. Apps Script プロジェクトを開きます。
    2. [トリガー] をクリックします。
    3. [トリガーを追加] をクリックします。
    4. [YOUR_PROJECT_NAME のトリガーを追加] ダイアログで、トリガーを構成します。
      1. [実行する関数を選択] リストで、[handleEdit] を選択します。
      2. [実行するデプロイを選択] リストで、[Head] を選択します。
      3. [イベントソースを選択] リストで、[スプレッドシートから] を選択します。
      4. [イベントタイプを選択] リストで、[編集時] を選択します。
      5. [障害通知設定] リストで、[毎日通知] を選択します。
    5. [保存] をクリックします。
    6. Google アカウントを選択するように求められたら、適切なアカウントを選択して [許可] をクリックします。

      これにより、Apps Script プロジェクトが Google スプレッドシートのシートを表示、編集、作成、削除し、外部サービスに接続できるようになります。

  4. Apps Script プロジェクトのマニフェスト ファイルは、Apps Script がスクリプトを正常に実行するために必要な基本的なプロジェクト情報を指定する JSON ファイルです。Apps Script エディタでは、Apps Script プロジェクト設定を保護するため、デフォルトでマニフェスト ファイルが非表示になります。マニフェスト ファイルを編集します。

    1. Apps Script プロジェクトを開きます。
    2. [プロジェクトの設定] をクリックします。
    3. [「appsscript.json」マニフェスト ファイルをエディタで表示する] チェックボックスをオンにします。
    4. [編集者] をクリックします。
    5. マニフェスト ファイルは、appsscript.json という名前のプロジェクト ファイルとして表示されます。ファイルを編集するには、そのファイルを選択します。
    6. oauthScopes フィールドは、文字列の配列を指定します。プロジェクトで使用する認証スコープを設定するには、サポートするスコープを含む配列を追加します。次に例を示します。

      {
        "timeZone": "America/Toronto",
        "dependencies": {
        },
        "exceptionLogging": "STACKDRIVER",
        "runtimeVersion": "V8",
        "oauthScopes": [
          "https://www.googleapis.com/auth/script.external_request",
          "https://www.googleapis.com/auth/cloud-platform",
          "https://www.googleapis.com/auth/spreadsheets"
        ]
      }

      これにより、明示的なスコープが次のように設定されます。

      • 外部サービスへの接続
      • Google Cloud データの表示、編集、設定、削除、および Google アカウントのメールアドレスの表示
      • Google スプレッドシートのすべてのスプレッドシートの表示、編集、作成、削除
    7. [保存] をクリックします。

VM インスタンスを作成するワークフローをデプロイする

VM インスタンスの作成リクエストが承認されたときにトリガーされるワークフローをデプロイします。ワークフローは、Compute Engine API コネクタを呼び出して、フォームから収集した仕様に基づいて Compute Engine VM インスタンスを作成します。

コンソール

  1. Google Cloud コンソールで、[ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [ 作成] をクリックします。

  3. 新しいフィールドの名前を入力します: create-vm-from-form

  4. [リージョン] リストで [us-central1 (Iowa)] を選択します。

  5. [サービス アカウント] で、Compute Engine のデフォルトのサービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com)を選択します。

  6. [次へ] をクリックします。

  7. ワークフロー エディタで、次のワークフローの定義を入力します。

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  8. [デプロイ] をクリックします。

gcloud

  1. ワークフローのソースコード ファイルを作成します。

    touch create-vm-from-form.yaml
  2. テキスト エディタで、次のワークフローをソースコード ファイルにコピーします。

    main:
       params: [input]
       steps:
       - init:
           assign:
                - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - zone: ${input.zone}
                - machineType: ${input.machineType}
                - diskSize: ${input.diskSize}
                - imageProject: ${input.imageProject}
                - imageFamily: ${input.imageFamily}
                - vmName: ${input.vmName}
                - email: ${input.email}
       - createResource:
           call: googleapis.compute.v1.instances.insert
           args:
               project: ${projectId}
               zone: ${zone}
               body:
                   name: ${vmName}
                   machineType: ${"projects/" + projectId + "/zones/" + zone + "/machineTypes/" + machineType}
                   disks:
                    - initializeParams:
                        diskSizeGb: ${diskSize}
                        sourceImage: ${"projects/" + imageProject + "/global/images/family/" + imageFamily}
                      type: PERSISTENT
                      boot: true
                      autoDelete: true
                   networkInterfaces:
                    - network: "global/networks/default"
           result: insertResult
       - retStep:
           return: ${insertResult}
  3. 次のコマンドを入力してワークフローをデプロイします。

    gcloud workflows deploy create-vm-from-form \
        --source=create-vm-from-form.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER は、使用する Google Cloudプロジェクト番号に置き換えます。プロジェクト番号を取得します。

    gcloud projects describe PROJECT_ID

エンドツーエンドのフローをテストする

すべてが想定どおりに動作していることを確認するには、プロセス全体を実行してみます。

  1. フォームを自分自身に送信し、質問に適切に回答します。

    VM インスタンスの作成に使用する仕様が有効であることを確認します。有効でない場合、ワークフローの実行は失敗します。詳細については、Compute Engine の汎用マシン ファミリーをご覧ください。

  2. 回答を送信するには、[送信] をクリックします。

  3. Google フォームでフォームを開きます。

  4. [回答] をクリックします。

  5. [Google スプレッドシートで表示] をクリックします。

    リンクされたスプレッドシートが開きます。

  6. 回答の行で、[承認済みですか?] チェックボックスをオンにします。

  7. Apps Script プロジェクトを開きます。

  8. [実行] をクリックします。

    トリガーが実行され、ステータスが Completed と表示されます。

  9. create-vm-from-form ワークフローが正常に完了したことを確認します。

    コンソール

    1. Google Cloud コンソールで [ワークフロー] ページに移動します。

      [ワークフロー] に移動

    2. [ワークフロー] ページで [create-vm-from-form] ワークフローをクリックし、詳細ページに移動します。

    3. [ワークフローの詳細] ページで、特定の実行の詳細を取得するには、該当する実行 ID をクリックします。

      [実行状態] は [成功] になり、入力ペインにリクエストした VM 仕様が表示されます。

    gcloud

    ワークフローの実行試行のリストを取得します。

    gcloud workflows executions list create-vm-from-form

    結果の例を以下に示します。

    NAME: projects/918619793306/locations/us-central1/workflows/create-vm-from-form/executions/d8947ecb-9ccb-4ea1-ba10-e5c10414e3be
    STATE: SUCCEEDED
    START_TIME: 2023-01-24T15:07:40.404741791Z
    END_TIME: 2023-01-24T15:07:55.649373625Z
  10. 新しい VM が想定どおりに作成されたことを確認します。

    コンソール

    Google Cloud コンソールで、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

    VM インスタンスが、実行中であることを示すステータスとともに表示されます。

    gcloud

    プロジェクトのすべてのゾーンにあるすべての VM の集計リストを取得します。

    gcloud compute instances list

    VM インスタンスが、実行中であることを示すステータスとともに表示されます。

    gcloud compute instances list コマンドの詳細については、リファレンス ページをご覧ください。