Google Spreadsheetに新しい行が追加されたらwebhookとしてidobataに通知を飛ばす方法

バイト先ではチャットツールとしてidobataを使っています。idobataではwebhookのbotがかなり簡単に作ることが可能で、あるエンドポイントに対してpostでアクセスをすると発言をするbotを構成することができます。また形式としてHTMLをサポートしており、特定のオプションを付けてエンドポイントを叩くことでHTMLにレンダリングされたメッセージを発言させることが可能です。

今回はあるスプレッドシートの新規書き込みがあるとidobataに通知を送る仕組みを作りたく、アドオンの設定をするよりGASで書いたほうが様々な面で良かった為にGASでおおよそのbotを作成しました。そのメモです。

最終更新行の検知

GASでスプレッドシートを利用する場合、まずActiveになっているシートを取得する必要があります。

const sheet = SpreadsheetApp.getActiveSheet() などとすると保持することが可能です。  なおGASは let が使えず constvar で定義をしていく世界観のようです。 Overview of Google Apps Script

次に最終更新の行と列を取得する必要があります。 列は正直どっちでも良いと思うのですが、行は必須となります。 今回のスプレッドシートは、新規依頼が末尾に積まれていくタイプであるのでgetLastRow() で取得する事が可能です。

function add_new_dojo_notice() {
  const sheet = SpreadsheetApp.getActiveSheet()

  const lastRow = sheet.getLastRow()
  const lastColumn = sheet.getLastColumn();

ここから一行の各セルをhtmlに修正してsendするという作業を行っていきます。 今回は予め params_info という変数にbotの出力用も兼ねて種類を配列形式でいれています。

この getRange() では最初に行、次に列番号を指定し、続いて行数の範囲を指定を行います。 なお最後の2変数は省略する事も可能となっています。 ここでは最終更新の1行の各セルを取りたい為、最後の2つは 1,lastColumn としています。

今回は列のサイズ分 i をインクリメントし、セルを右に移動しながら文字列 send_paramas に追記を行っていきます。

ここで注意する事は getRange() で取得する列番号はスプレッドシートの番号であるため、配列形式のようにインデックスが0スタートではありません。基本的に1スタートです。今回は空入力の場合表示させないなどを記述しています。

  for ( var i = 1; i < params_info.length; i++){

    if (sheet.getRange(lastRow,i,1,lastColumn).getValue() == ""){
        continue;
    }

      send_params += sheet.getRange(lastRow,i,1,lastColumn).getValue()
  }

  notice_to_idobata(send_params);
}

実際に通知を送る部分のコードはこの用に素朴になっています。 先程の send_paramssource に紐付けて送っています。

function notice_to_idobata(message) {
  const idobataURL = "IDOBATA.url"

  const playload =
   {
     "source" : message,
     "format" : "html",
   };

  const options = {
    "method" : "post",
    "payload" : playload,
    "format" : "json",
  };

  UrlFetchApp.fetch(idobataURL, options);
  Logger.log(options);
}

注意するべきなのは、idobataにmessageを送る際、送りたいメッセージは source の対応として送らなければなりません。

またこの際にhtmlで送る場合 playloadformat をhtmlに指定しておく必要があります。 指定しなければ、idobata側でHMLタグをただの文字列として解釈します。

options でtypeの指定も可能ですが、これはidobataに対しては意味が無いです。

トリガーの設定

作成したスクリプトは「編集」から「現在のプロジェクトのトリガー」を選択する事でトリガーを仕掛ける事が可能です。 トリガーにはいくつか種類がありますがこのエントリ公式ドキュメントを見る限り「submit」か「値の変更」で行うと良さそうでした。