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 のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、このチュートリアルのワークフローに関連付けるためです。Compute Engine API が有効になっている新しいプロジェクトには、IAM 基本編集者ロールや、以下のメール形式を持つサービス アカウントが作成されます。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

    本番環境では、新しいサービス アカウントを作成して、必要最小限のアクセス許可を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

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

    gcloud services enable \
        compute.googleapis.com \
        workflows.googleapis.com
  4. Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、このチュートリアルのワークフローに関連付けるためです。Compute Engine API が有効になっている新しいプロジェクトには、IAM 基本編集者ロールや、以下のメール形式を持つサービス アカウントが作成されます。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

    gcloud projects describe PROJECT_ID

    本番環境では、新しいサービス アカウントを作成して、必要最小限のアクセス許可を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

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. フォームでフォームを開きます。
  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 インスタンスを作成します。

Console

  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. フォームでフォームを開きます。

  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. ワークフローを削除する

次のステップ