バイト先ではチャットツールとしてidobataを使っています。idobataではwebhookのbotがかなり簡単に作ることが可能で、あるエンドポイントに対してpostでアクセスをすると発言をするbotを構成することができます。また形式としてHTMLをサポートしており、特定のオプションを付けてエンドポイントを叩くことでHTMLにレンダリングされたメッセージを発言させることが可能です。
今回はあるスプレッドシートの新規書き込みがあるとidobataに通知を送る仕組みを作りたく、アドオンの設定をするよりGASで書いたほうが様々な面で良かった為にGASでおおよそのbotを作成しました。そのメモです。
最終更新行の検知
GASでスプレッドシートを利用する場合、まずActiveになっているシートを取得する必要があります。
const sheet = SpreadsheetApp.getActiveSheet()
などとすると保持することが可能です。
なおGASは let
が使えず const
かvar
で定義をしていく世界観のようです。
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_params
をsource
に紐付けて送っています。
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で送る場合 playload
のformat
をhtmlに指定しておく必要があります。
指定しなければ、idobata側でHMLタグをただの文字列として解釈します。
options
でtypeの指定も可能ですが、これはidobataに対しては意味が無いです。
トリガーの設定
作成したスクリプトは「編集」から「現在のプロジェクトのトリガー」を選択する事でトリガーを仕掛ける事が可能です。 トリガーにはいくつか種類がありますがこのエントリや公式ドキュメントを見る限り「submit」か「値の変更」で行うと良さそうでした。