Googleスプレッドシートの内容をSlackに通知する

Googleフォームを使うと簡単にアンケートや問い合わせの入力フォームを作成することができる。 フォームの入力内容はGoogleドライブに作成されるGoogleスプレッドシートに自動的に保存される。 さらに、Googleフォームを使った投稿があったとき、Gmailだけでなくその他のWebhookが使えるツール(今回はSlack)に通知させることができる。

通知の連携にはGoogle App Script(以下、GAS)というJavaScriptに似た言語でスクリプトを書く必要があるが、Slackへの投稿方法とスクリプトは参考になる記事があったので後ほど紹介しておく(自分の備忘録を兼ねて)。

この記事では、Googleフォームで投稿された情報が保存されているGoogleスプレッドシートから最新の投稿を、1日1回Slackに通知させるGASについて書いておく。

Google App Scriptの参考記事

先人達の書いてくれているGoogleフォームの使い方、SlackのWebhook作成方法、Slackへの通知スクリプトについての記事を紹介する。

スプレッドシートの内容を通知する

スプレッドシートについて

スプレッドシートにはGoogleフォームでの入力内容が以下の画像のように蓄積されている(一部画像編集)。 新しい投稿があると、1枚目のシートのデータのある最下行の下に新規に追加される。

A列には自動的に収集されるタイムスタンプ、つまりGoogleフォームで投稿があった時刻が記録される。 B列以降はフォームに存在する質問が入っていく。 ちなみに質問1(B列)は数値、質問2(C列)は日付、質問3(D列)はプルダウンである。

スプレッドシートの情報を読み取って通知する

先述のように新しい投稿はスプレッドシートのデータのある最下行の下に追加されるため、最下行が最新データとなる。 今回の通知では、1日1回スプレッドシートから最新データを取り出してSlackに通知する。 利用方法としては、体重測定や薬の飲み忘れ防止として前日の結果を含めて投稿させるなどである。

Slackへの投稿は、前述の記事を参考にスクリプトを作成してほしい。

スプレッドシートの情報を読み取って通知するスクリプトは以下のとおりだ。

function trigger() {
  var ss = SpreadsheetApp.openById("1aVzXpskb_wRTIOvWYjuxGh1r4b1jgcHmZzbeWnquyFM");
  var sheet = ss.getSheetByName("フォームの回答 1");

  var lastRowNumber = sheet.getLastRow();

  var timestampRaw = sheet.getRange(lastRowNumber, 1).getValue();
  var timestamp = Utilities.formatDate(timestampRaw,"JST", "yyyy/MM/dd HH:mm:ss");
  var num = sheet.getRange(lastRowNumber, 2).getValue();
  var dateRaw = sheet.getRange(lastRowNumber, 3).getValue();
  var date = Utilities.formatDate(dateRaw,"JST", "yyyy/MM/dd");
  var drink = sheet.getRange(lastRowNumber, 4).getValue();

  var body = "<@somebody> \n\n" + "前回の記録は以下のとおりです。\n";
  var data = "タイムスタンプ:" + timestamp + "\n質問1:" + num + "\n質問2:" + date + "\n質問3:" + drink;
  var form = "\n本日の記録をしてください:" + "https://docs.google.com/forms/d/e/formformform/viewform"
  var publish = body + data + msg + form;
  sendToSlack(publish, "#channel");
}

L.1 trigger関数

この関数をGASの設定で1日1回指定した時刻に実行させる。

L.2 SpreadsheetApp.openById

引数で指定したスプレッドシートを開く関数。 引数のIDは、スプレッドシートを開いたときのURLhttps://docs.google.com/spreadsheets/d/<スプレッドシートのID>/edit#abcdefからわかる(https://docs.google.com/spreadsheets/d/test001spreadsheet/edit#abcdefならIDはtest001spreadsheet)。

SpreadsheetAppはGASに組み込まれているクラスなので何もせずとも使うことができる。

L.3 getSheetByName

取得したスプレッドシートのシートをシート名で取得する。

L.5 getLastRow

取得したシートのデータが存在する最下行、最新データの行番号を取得する。 あとで、行番号と列番号をつかって特定のセルのデータを取得するために使う。

LL.7-12 データ取得、日付変換

getRangeは第一引数に行番号、第二引数に列番号を入れることで特定のセルを取得できる。 取得したセルに対してgetValueを使うことでセルのデータを取得できる。

日付データの場合(L.8とL.11)、Utilities.formatDateを使うことで特定のフォーマットの文字列に変換する。 第一引数が日付データ、第二引数にタイムゾーン(日本なのでJST指定)、第三引数にフォーマット形式を指定する。

LL.14-17 整形

データをSlack通知のために整形している。 特に面白いことはないが、Slackで誰か宛に投稿する場合は<@somebody>のようにする必要がある。

L.18 sendToSlack関数

紹介した記事のsendToSlack関数を使って通知をおこなう。

おわり

今回のスクリプトは、毎日忘れずに何かをする場合に、Googleフォームとスプレッドシート、Slackを使って記録・保存・通知をさせる方法として結構便利に使っている。 投稿を忘れても前日の記録がないことを教えるような投稿をさせるともっと使いやすいかもしれない。

最後に、Googleスプレッドシートを扱うGAS実装で参考にした記事を紹介しておく。