GASとスプレッドシートを活用したサーバレス通知システム
この記事はGMOペパボ Advent Calendar 2019 - Qiita 14日目の記事です。
目次
- 社内・自作Slack通知ツール紹介
- おすすめGAS開発方法(clasp + TypeScript)
- Slack通知ツールの仕組み
- まとめ
社内・自作Slack通知ツールの紹介
ペパボではコミュニケーションツールとしてSlackを利用していますが、業務を行う上で様々なSlack通知が行われています。 よく利用される通知ツールの1つにGoogleスプレッドシートとGASを組み合わせた定期的なSlack通知ツールがあります。 そもそもは、はてなのmotemenさんの2016年の投稿記事(Googleスプレッドシートをcronのように使いSlackに投稿する)がもとで社内で広くこのデザインパターンを利用した通知ツールが作られはじめたようでした。
便利すぎるのに無料で作れるしとにかくおすすめだったので今回 Advent Calendarの記事のネタとして選びました!
主だったものをいくつか紹介します。
社内Slack通知ツール
お知らせさん
: 指定日時にSlackに任意のコメントをしてくれる(メンションも可能)あと何日くん
: サービスの機能リリースやイベント開催日までの残営業日数を毎日カウントダウン通知してくれる- Luch Wagon for GAS: Slackユーザーグループ内のメンバーをランダムに選出してして指定曜日のランチメンバーを自動選出して通知
- GitHub Issue Notice : GitHubの指定ラベルの付いたIssueやPRの通知
※ GitHubのリンクがないものはprivateレポジトリか自分が見つけきれなかったためリンクなしとなっています
自作Slack通知ツールなど
このSlack通知ツールの仕組みに興味があり、2019年下期に自身も3つ同様のデザパタで通知ツールを作成したので紹介します。
Redash Query Notice
- サービスで利用しているRedashの指定IDのクエリ実行結果をSlack通知するツール
- GitHub Issue Noticeに完全にインスパイアされて作ったツール
- 複数のクエリ実行結果をまとめて通知したり、1クエリで複数カラム出力される結果を通知もできる
- 機能的にまだ最低限しかないしPR募集中です
スプレッドシート設定例
Slack通知例(左: 複数のクエリをまとめた通知、右: 1クエリで複数出力あるクエリの通知)
Grett
[is:unread from: Qiita
というフィルタを設定した場合の通知例]
LINE Message Notice
- 通知先をSlackではなくLINEにした通知ツール
- 3つめに作ったものなのでわりと実装途中で力尽きてる感が…
- https://github.com/litencatt/line-message-notice
おすすめのGAS開発法: clasp + TypeScript
- google/claspというGoogle謹製のCLIツールが存在するので使うべし!
- 何が良いのかと言うとTypeScriptで書ける!(clasp push時にGASに自動変換してくれる)
- なので手元で好きなエディタで書ける
- 参考: Qiita - GAS のGoogle謹製CLIツール clasp
GASを用いたSlack通知ツール開発方法
Slack通知までの主な処理フロー
redash-query-noticeのmain.tsのコードをみてもらうとわかると思いますが、以下の処理をやっています。他も大体この流れでやっているので特に複雑ではないです。
- GASのトリガー設定をもとに周期的にスクリプト起動
- スプレッドシートからの設定読み込み
- 指定日時かどうかの実行タイミングの判定
- Slack通知させる情報の取得
- Slack通知
- 3-5を設定されてる行数(=タスク数)分実行する
GASのトリガー設定
- 以下のようにGAS側のトリガー設定で1分おきなどに呼び出すようにしておきます
GASを利用したSlack通知ツールのメリット・デメリット
メリット
- サーバレスに動作させることができて運用コストかからない
- 設定ファイルの書換えもスプレッドシートのリンク知っていればいつでも誰でも追加・編集できる
デメリット
- 開発(デバッグ)が若干しにくい
GAS開発時の注意事項
- スプレッドシートの値はスプレッドシート側の対象セルの表示形式で取得時の値の型が変わるので注意
- セルの入力値が数字の場合でも表示形式が
書式なしテキスト
などに設定されるとString型として扱われるなど
- セルの入力値が数字の場合でも表示形式が
- GASはJavaScriptに似ているがJavaScriptではないので予期しないエラーが発生する場合がある
- e.g
Object.assign
が使えない - 実際にredash-query-notice開発時にこのエラーに遭遇したので一部書き換えました
- e.g
GAS向けClassリファレンス
まとめ
GASはGoogleのリソースにアクセスするためのClassをだいたい用意してくれているのでスプレッドシートやGmailへのアクセスも容易かつ扱いやすいため、アイデア次第で色々できそうなのでこれをきっかけに皆さんも色々試してもらえると幸いです!