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


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

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

目標

このチュートリアルの内容は次のとおりです。

  1. クラウドベースのアンケートとアンケートのソリューションである Google フォームを使用して、仮想マシン(VM)インスタンスを作成するリクエストを送信できるフォームを作成します。
  2. Google スプレッドシートのスプレッドシートをフォームにリンクし、回答を収集して保存します。
  3. Google Apps Script(クラウドベースの JavaScript プラットフォーム)を使用して、Google Workspace プロダクトの作成、読み取り、編集をプログラムで行い、スプレッドシートの更新を通してリクエストが承認されるたびにワークフローをトリガーします。
  4. Compute Engine API コネクタを呼び出すワークフローをデプロイし、フォームから収集した仕様に基づいて Compute Engine VM インスタンスを作成します。コネクタにより、他の Google Cloud API の呼び出しが簡単になります。Workflows コネクタの詳細を確認する
  5. プロセス全体をテストして、VM インスタンスが想定どおりに作成されたことを確認します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このチュートリアルでは、Google Workspace も使用します。Google の無料の一ユーザーアプリに含まれていないビジネス レベルのサービスは、課金対象になります。

始める前に

Google Cloud コンソールで次のコマンドを実行するか、ターミナルまたは Cloud Shell で Google Cloud CLI を使用できます。

組織で定義されたセキュリティの制約により、次の手順が完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

コンソール

  1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. Compute Engine API と Workflows API を有効にします。

    API を有効にする

  4. Compute Engine API が有効になっている新しいプロジェクトには、Identity and Access Management(IAM)の基本編集者ロールや、以下のメール形式を持つ Compute Engine のデフォルトのサービス アカウントが作成されます。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

    このサービス アカウントは、テスト目的でこのチュートリアルのワークフローに関連付けるため、メモしておきます。

gcloud

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. Compute Engine API と Workflows API を有効にします。

    gcloud services enable \
        compute.googleapis.com \
        workflows.googleapis.com
    
  4. Compute Engine API が有効になっている新しいプロジェクトには、IAM 基本編集者ロールや、以下のメール形式を持つ Compute Engine のデフォルトのサービス アカウントが作成されます。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    プロジェクト番号を取得します。

    gcloud projects describe PROJECT_ID
    

    このサービス アカウントは、テスト目的でこのチュートリアルのワークフローに関連付けるため、メモしておきます。

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

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

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

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

  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 スプレッドシートで 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 インスタンスを作成します。

Console

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

    [ワークフロー] に移動

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

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

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

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

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

  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. [Deploy] をクリックします。

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 コマンドの詳細については、リファレンス ページをご覧ください。

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

このチュートリアルで作成したリソースを削除する

  1. ドライブ内のファイルを削除する
  2. Compute Engine VM インスタンスを削除する
  3. ワークフローを削除する

次のステップ