特定のワードが入ったメッセージのリンクを特定のチャンネルに投げるSlack Botの開発(GAS)
タイトルのとおり、特定のワードが入ったメッセージのリンクを特定のチャンネルに投げるSlack Botを作っています。コードはもう書きました。GitHubのこちら
これなら役に立ちそうなので、記事にしたいなと思っていますが、「記事にするならSlack側の操作(bot作る部分から)スクショを載せたほうが良いんじゃないか?」と思ったので、次に導入する時(本番環境的なワークスペースに入れるとき)にスクショ取ってから記事にしようと思います。
今はそれまでに知見を忘れないように&文章化できる部分は文章化して用意しておくためにここにメモします。
このBotの用途として、例えば「iOSに関する質問です」というワードを含むメッセージを#question-iosチャンネルに、「Androidに関する質問です」というワードを含むメッセージを#question-androidチャンネルに、「hoge(他の条件に当てはまらない文字列)に関する質問です」というワードを含むメッセージを#question-othersチャンネルに投げるといった運用を考えている
(※Twitterフォロワーだともうどこで使うかお察しの人もいるかも知れませんが、本番は本当にこの文字列やチャンネル名を使うかはまだ決まってません!念の為)
コードはほぼ上記リポジトリの通り
GASのスクリプトのプロパティにトークンとか入れて、あとはコード内のチャンネルIDとかトリガーワードをよしなに置き換えれば使える、はず
例えば上記の例で言えば
const channels = {
// 転送する条件となるワードと、転送先のチャンネルIDをkey value形式で代入
"iOS": "iOSが書かれていた時に転送するチャンネルのID",
"Android" : "Androidが書かれていた時に転送するチャンネルのID",
"Other" :"それ以外が書かれていた時に転送するチャンネルのID"
};
const keys = Object.keys(channels);
const trigger_word = "に関する質問です"; // 転送するトリガーワード
とすればできる
ただ、今のコードだとchannelsのkeyとtrigger_wordがつながって文字列として含まれている場合のみ転送される事になっているけど、trigger_wordを「質問」くらいにして、「iOS」と「質問」が含まれていたら#question-iosに転送…という形のほうがいいのかもしれない
今思いつきで書いたのでコード考えていないけど、 indexOfでまず「質問」というワードが含まれているかを判定して、それから「iOS」なのか「Android」なのかを判定するのが良いのかな…?
Event APIは理解が進んだけど投稿周りはちょっと曖昧かもしれない
Botに与えなくて良い権限も与えている気がする…なので、記事にする前にはそこも調べないといけないかも!
参考にした記事のリンクもまとめておきましょう
Slack Bot側
SlackのtokenとAPI、botの種類をまとめた
[GAS]Slackのbotを作る方法を、お節介なほど丁寧に説明
Spreadsheet側
【GoogleAppsScript】スプレッドシート操作(セルへのデータ書き込み偏)
Google Apps Script で Spreadsheet にアクセスする方法まとめ ←これは直接参考にしてないけど、GAS初心者には重要な情報、というか基本
他にも参考にした記事があった気がするけど忘れた…履歴見てもわからん
記事のときはもっとわかりやすく解説できるように、スクショを撮りながら作業を進めているところです。
気づいた点としては、botの導入とコードの解説は別にしたほうがよさそうということ
理由の1つは、両方いっぺんにやると長くなりすぎてしまいそうだから
もう1つは、botの導入の部分は、今回の目的以外でも使えそうなので、あまり絞り込まないタイトルにしたほうがより多くの人に役立ちそう(見てもらえそう)だから
汎用的な部分は切り分けるみたいな気持ちでまとめよう…(今月中にできるかな)
導入やっていったら「これ忘れてた」って感じで数箇所手戻りが発生した
あとなぜか一度はEvent SubscriptionsをOnにしたはずなのにOffになってた(スクリプト更新したから?)
初心者がつまづきそうなところは、GASコード更新した後に公開のほうの更新をし忘れるとか、BotのScopeとかそのあたりなのかな
コードの変更として、以下の2点を実施(まだGitHubには反映してない)
indexOf
をつかってトリガーワードが入っているかチェックしていたところをincludes
にしました。
SlackのEvents APIで取得するタイムスタンプであるts
はunixtimeなので、よしなに日時に変換してスプレッドシートに記録するようにしました。
上記の変更反映した&リンク(というかリポジトリ内の階層)を変更したので今後はこっち
ちなみにプロジェクト時代に動かしていた褒めBotはその後API仕様が変わって動かなくなりましたが、上記Botを作ったことで現在のAPIも理解できたため、実装し直して褒めBot ver.2として研究室に導入しました。
褒めBotのほうが機能は少ないので、上記の記事の内容ができればかんたんに実装できます :+1: