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募集中です

github.com


スプレッドシート設定例


Slack通知例(左: 複数のクエリをまとめた通知、右: 1クエリで複数出力あるクエリの通知)

Grett

  • GMailの受信メールのサマリーをSlack通知するツール
  • GMailのメール検索で使えるフィルタ記法も指定可能

github.com


[is:unread from: Qiitaというフィルタを設定した場合の通知例]

LINE Message Notice

おすすめのGAS開発法: clasp + TypeScript

GASを用いたSlack通知ツール開発方法

Slack通知までの主な処理フロー

redash-query-noticeのmain.tsのコードをみてもらうとわかると思いますが、以下の処理をやっています。他も大体この流れでやっているので特に複雑ではないです。

  1. GASのトリガー設定をもとに周期的にスクリプト起動
  2. スプレッドシートからの設定読み込み
  3. 指定日時かどうかの実行タイミングの判定
  4. Slack通知させる情報の取得
  5. Slack通知
  6. 3-5を設定されてる行数(=タスク数)分実行する

GASのトリガー設定

  • 以下のようにGAS側のトリガー設定で1分おきなどに呼び出すようにしておきます

GASを利用したSlack通知ツールのメリット・デメリット

メリット

  • サーバレスに動作させることができて運用コストかからない
  • 設定ファイルの書換えもスプレッドシートのリンク知っていればいつでも誰でも追加・編集できる

デメリット

GAS開発時の注意事項

GAS向けClassリファレンス

まとめ

GASはGoogleのリソースにアクセスするためのClassをだいたい用意してくれているのでスプレッドシートGmailへのアクセスも容易かつ扱いやすいため、アイデア次第で色々できそうなのでこれをきっかけに皆さんも色々試してもらえると幸いです!