特定のreactionを付けると時間に応じてリマインドするSlack Bot [Google Apps Script]

2023/06/26に公開

Later Bot

:later-: prefixのリアクションがついた時に、以下のタイミングでリアクションをつけた人にメンションを飛ばすSlack BotをGASで実装しました

  1. リアクションを付けた時
  2. リアクションの種類に応じたリマインドタイミング (e.g. :later-5min:なら5分後)

https://github.com/alquist4121/slack-later-bot/tree/main

手順

Slack APIに登録するresponse urlが二つ欲しいので、Spreadsheet(と対応するGAS project)を二つ用意

  • get_and_post
    • reactionの追加を監視する
    • reactionを追加したユーザに通知する
    • reactionの内容に応じて投稿予約する
  • delete
    • Mark As Completedボタンが押されたかを監視する
    • reactionの投稿予約をキャンセルする

スクリプト

GitHubのget_and_postdeleteのスクリプトを、それぞれ対応するプロジェクトに追加する(コピペOK)

Slack App

アプリを作る

Add features and functionality

Event Subscriptions

  • reactionが追加された時のイベントを受け取るresponse urlを追加
    • GitHubのget_and_postに対応するGAS projectをデプロイした時のurl(後述)
  • reaction_addedを設定

Interactivity

  • Mark As Completedボタンが押された時のイベントを受け取るresponse urlを追加
    • GitHubのdeleteに対応するGAS projectをデプロイした時のurl(後述)

OAuth & Permissions

  • Scopesにchat:writeを追加
  • reactions:readはEvent Subscriptionsを追加した際に自動で追加されている
  • User TokenとBot User Tokenをそれぞれ取得

API Token

取得したAPI tokenをScript Propertyに設定

  • SLACK_BOT_USER_TOKEN
  • SLACK_USER_TOKEN

Deploy

  • デプロイ>webアプリurlを取得

ログをSpreadsheetに蓄積

  • コード内のsheet.appendRow([~~~]);で追加

To Be Improved

  • :later-: reactionパースのswitch文がハードコーディングすぎる
  • Mark As Completedボタンを押された時にボタンUIをアップデートしたい
  • ログはGCP Cloud loggingに蓄積した方がいいっぽい

Discussion