GASを利用してEvent WebhookのデータをGoogle スプレッドシートに出力する

GASを利用してEvent WebhookのデータをGoogle スプレッドシートに出力する

Twilio SendGridのEvent Webhookを使うと、アカウントで発生したイベント情報を外部環境にPOSTできることをご存じですか?POSTデータの受信環境を整えておけば、ログとして保存できるだけでなくデータ分析などにも活用できるため、設定しておくことをお勧めしています。

しかし、この機能を使うには受信データを処理する仕組みを自分で構築する必要があります。便利な機能ではありますが、サーバやプログラミングの知識がない方にとっては少し手を出しづらいかもしれません。

そこで今回は、Googleが提供するローコードプラットフォームであるGoogle Apps Script(GAS)を利用して、SendGridのイベントデータをGoogle スプレッドシートに保存する方法をご紹介します。

GASはGoogleアカウントを所有していれば無料で利用できるので、Event Webhookの受信環境をお手軽に構築したい方はぜひご一読ください!

必要なもの

GASの準備

1. データ出力用のGoogle スプレッドシートを作成し、Apps Scriptを開く

メニューバーの「拡張機能」→「Apps Script」を選択します。

メニューバーの「拡張機能」→「Apps Script」を選択

「無題のプロジェクト」という名称の新しいApps Scriptが開きます。適宜プロジェクト名を変更してください。

「無題のプロジェクト」という名称の新しいApps Scriptが開く

2. 受信データをスプレッドシートに書き出す処理を実装する

今回使用したサンプルコードを以下に示します。
Event Webhookで受け取ったJSONのデータを解析し、パラメータ毎に出力する、といった流れとなっています。イベントによって含まれるパラメータが異なるので適宜ヘッダが追加できるようにしています。

function doPost(e){
  // POSTデータ取り出し
  let postContent = e.postData.getDataAsString();
 
  // POSTデータをオブジェクト型に変換
  let json = JSON.parse(postContent);
  // 出力するシートを取得
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let headerRow = sheet.getDataRange().getValues()[0];


  // ヘッダがない場合1件目のパラメータを基準にヘッダを作成する
  if(headerRow.length == 1 && headerRow[0] == ""){
    let index = 1;
    for(let param in json[0]){
      let header = sheet.getRange(1, index);
      header.setValue(param);
      index++;
    }
    // 変数の更新
    headerRow = sheet.getDataRange().getValues()[0];
  }


  for(i = 0; i < json.length; i++){
    // 最終行を取得
    let lastRow = sheet.getLastRow();
    // スプレッドシートのヘッダと比較してパラメータがあるかチェック
    for(let param in json[i]){
      let addColNum = headerRow.indexOf(param) + 1;
      if(addColNum == 0){
        // スプレッドシートのヘッダにパラメータが存在しないのでヘッダ追加
        let headerRange = sheet.getRange(1, headerRow.length + 1);
        headerRange.setValue(param);
        // ヘッダ情報を更新
        headerRow = sheet.getDataRange().getValues()[0];
        addColNum = headerRow.length;
      }
     
      // データを追加
      let range = sheet.getRange(lastRow + 1, addColNum);
      range.setValue(json[i][param]);
    }
  }
}

コードの入力が完了したらアイコンをクリックして保存します。

アイコンをクリックして保存

3. デプロイする

右上の「デプロイ」→「新しいデプロイ」を選択します。

右上の「デプロイ」→「新しいデプロイ」を選択

「種類の選択」(歯車マーク)で「ウェブアプリ」を選択します。各設定項目には以下のように入力してください。

  • 新しい説明文:適宜入力してください(未入力でもOK)
  • 次のユーザーとして実行:自分
  • アクセスできるユーザー:全員

「種類の選択」で「ウェブアプリ」を選択、各設定項目に入力

プロジェクトで初めてデプロイする場合、データへのアクセス承認が必要です。「アクセスを承認」をクリックします。

「アクセスを承認」をクリック

ログイン中のアカウント情報が表示されるので、アカウントを選択します。

アカウントを選択

「このアプリはGoogleで確認されていません」の画面で、左下の「詳細」を開きます。
スクリプトを実行しても問題なければ「ファイル名(安全ではないページ)に移動」をクリックします。

「ファイル名(安全ではないページ)に移動」をクリック

再度、問題がないことを確認したうえで「許可」をクリックします。

「許可」をクリック

デプロイが完了しました。
ここで表示されるURLは、この後EventWebhookの設定で利用するのでコピーしておきます。

表示されるURLをコピーしておく

以上でGASの準備は完了です。

SendGridの設定

Event Webhookの設定を行います。設定手順はチュートリアルをご確認ください。
各項目は次のように設定します。

  • Enable endpoint:ON
  • Post URL:GASの準備で取得したウェブアプリケーションのURL
  • Actions to be posted:通知したいイベントの種類をON

以下の項目は必要に応じて設定してください。

  • Friendly Name
  • Security features

Event Webhookの設定

「Save」をクリックして設定を保存します。

動作確認

Event Webhookの設定画面からテストデータを送信することができます。「Test Integration」をクリックしましょう。

スプレッドシートにデータが出力されました!

スプレッドシートにデータが出力される

スプレッドシート上でフィルタリングすることもできます。

スプレッドシート上でフィルタリングすることもできる

まとめ

初めに多少コーディングは必要となりますが、この方法であれば簡単に受信環境を構築でき、スプレッドシートの機能を使ってデータを活用することもできます。先述の通り、GASやスプレッドシートには制約があるため、大量データを受け付ける場合には別途対策を検討してください。

今回はスプレッドシートへのデータ保存方法を紹介しましたが、GASを利用すれば、何かをトリガにして通知メールを送ったり、Googleカレンダーに予定を作成したり、様々な外部サービスとの連携が可能です。ぜひ活用してみてください!

アーカイブ

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。