どーも!
今回はSlackとGASで定期的に通知を送るBotを作ってみようと思います!
文量は多いですが、以下の記事を読んだことがある場合は、比較的簡単にできると思います。
ではやっていきましょう!
目次
SlackとGASで定期的に通知を送るBotを作成する
今回、Slackへ定期的に決まった文章を送るために...
以下のようにする必要があります。
まず、Slack側でSlackAppというものを作成します。
このSlackAppで、外部サービスからの特定チャンネルへの投稿ができるWebHookURLを発行します。
つまり、メッセージの受信ができるように設定してあげる必要があるんですね。
あとは、GASスクリプト側で定期的に投稿したい内容を作成、その内容をチャンネルへ投稿するスクリプトを書きます。
そして、GASのトリガーという機能で、どういった頻度(週一なのか、毎時なのか...)で通知を飛ばすのかを設定できます。
ではやっていきましょう!
SlackApp・WebHookURLを作成する
まずはSlackAppを作成します。
SlackAppを作成する際、workspaceの選択とAppの名前を指定できます。
作成したら以下のようにAppHomeを選択し、AppDisplayNameを編集しておきましょう。
では、次にWebHookURLを作成します。
右上がOffになっている場合はOnにして、画面下部から、"Add New WebHook to workspace"を選択します。
この際、以下のように許可を求められる場合、どこに投稿すべきかを選択します。
ご自身で定期的に通知を飛ばしたいチャンネル、を選択してください。(その際、普段から業務で使用しているチャンネル等を指定している場合、テスト用の通知などが飛ぶと思うので、一言は入れたほうがいいかと思います。)
今回筆者は別途新規のチャンネルを作成しました。
作成したら、以下のようにWebHookURLができていることを確認してください。
また、Channelもちゃんと自分が通知したいチャンネルの名前になっていることを確認しておくといいです。
これで、WebHookURLの設定は完了です!
このWebHookURLを指定することで、GAS等の外部サービスからメッセージの送信を行うことができるようになりました!
つまり、GASのスクリプトにて、投稿する内容と一緒にWebHookURLを指定してリクエストを送ることで、SlackAppが
"あ、このWebHookURLにリクエストきたぞ!投稿しなきゃ!”
と、気づけるようになったわけです...!
それでは、次はリクエストを送るGAS側を作っていきます!
GASのスクリプトの作成
さて、実際にメッセージを送信するプログラムはGoogle Apps Scriptで作成します。
まずはご自身のGmailアカウントや、会社のGmailアカウント(会社で運用する場合)等でGoogleドライブの画面を開きます。
その中で、右クリック、その他、Google Apps ScriptでGASのスクリプトを作成することができます。
作成をすると、以下のような画面が開きます。
現在、なんの処理も行わない"myFunction"という関数が定義されている状態ですね。
では、以下をコピペしましょう。
function autoNotice() {
// 定期的に通知する内容を記載
const contents = `<@ユーザーID> テスト`
// リクエスト内容を整形
const options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(
{
"text" : contents,
link_names: 1
}
)
};
//投稿先
UrlFetchApp.fetch("あなたのSlackWebHookURL", options);
}
難しいことは今回割愛しますが、上記はJavaScriptというプログラミング言語で書かれていて、contents = ""の中身が実際のメッセージとして投稿される中身、そして投稿先が先程設定したWebHookURLのチャンネルに対して、そのメッセージを投稿するというコードになっています。
これを、GASのトリガーという機能で定期的に動かしてあげる,..ということで定期通知を実現していきます。
上記プログラムはそのまま貼り付けるだけではだめで...
二点注意が必要です。
まず、一点目が以下です。
const contents = `<@ユーザーID> テスト`
ここで、<@ユーザーID>と記載していますが、これはメンションを特定ユーザーにつける場合を想定しています。
例えば僕の場合...
テストようの僕のアカウントのIDは以下なので...
const contents = `<@U01FG389ZAQ> テスト`
こうすることでメンションが僕に対して着くはずです。
メンションが不要な場合はいったん"<>"の部分を全て削除して大丈夫です。
("<@here>や<@channel>でチャンネルユーザーへのメンション...も可能です。詳しくはSlackAPIを調べてみてください。)
そして、もう一点気をつけていただきたいのが 以下です。
UrlFetchApp.fetch("あなたのSlackWebHookURL", options);
ここで、"あなたのSlackWebHookURL”としているところには、そのまま先程発行したWebHookURLをコピペしてください。
ここで設定することで、GASで送るリクエストにWebHookURLが付与され、それを元にSlackAppが投稿できるわけですね...!
上記二点を修正したら、一度実行してみましょう。
実行は以下のような三角ボタンからできます。
その際、以下のような画面が出てくるかと思います。(メアドはテスト用なので、質問等きても返せません...w)
アカウントの選択を求められるので、任意のアカウントを選択します。(会社等の場合も会社の個人のアカウントでもいいですが、もしその人が退職してアカウント削除等された場合、影響が出るかもしれないので気をつけてください。)
選択すると...
以下のような画面が出てきます。
これは、今回このGASスクリプトで外部サービスへのアクセスが発生するため、その権限を付与しないといけないよー!っていうやつです。
デベロッパーが、あなたのアカウントのメールアドレスであることを確認した上で、"詳細を表示"すると、下の方に"安全でないページに移動"とあるので、そちらを選択します。
すると、上記のように外部サービスへの接続を許可していいか聞かれるので許可します。
許可をすると...?
以下のようにログが出てきます。
では、slackのチャンネルをみにいくと...?
このような感じで投稿が行われました!
これで、GASのスクリプトを実行すればこのメッセージが届くようになりました!
それでは最後に定期的に実行するためにトリガーの設定をしてみましょう!
トリガーの設定
さて、このトリガーとは引き金...といった意味合いもありますが、今回の場合、先ほど書いたGASのスクリプトを実行するための引き金...つまりきっかけ...といった具合です。
特定のイベント発生時(スプレッドシートが更新された時...とか)も設定できたりするんですが、今回はそういったイベントとは無関係で、定期的に時間ベースでトリガーを設定します。
以下のように左側の時計マークを選択するとトリガーの設定画面を開くことができます。
トリガー」の画面が開いたら、右下から追加をしましょう。
すると、以下のような設定画面が出てきます。
ここで、毎分や、毎時〜毎週月曜日〜といったことが設定できます。
簡単に項目を説明しておくと、実行する関数は先程記載したコードの一番上の部分が以下のようになっていたと思います。
function autoNotice() {
これは、autoNotice関数と呼ばれ、その中の処理に対して名前をつけている感じなんですが、そのどれをこの設定で実行しますか?ということですね。
コピペした場合は同じくautoNoticeを選択できると思うのでそのままで大丈夫かと思います。
次に実行するデプロイですが、これはHead(今編集しているコードがそのまま実行される状態)で大丈夫です。
もし今後スクリプトの修正等する場合に一時的であれど、うまく動かないと困る...という場合は、デプロイして、そのデプロイしたものを実行するようにしたほうがいいでしょう(詳細は割愛させていただきます。)
そして次のイベントのソースは"時間主導型”を選択してください。
これによって、時間をベースにトリガーの設定ができるようになります。
そして時間ベースのトリガーのタイプ...ですが、ここで分刻みか、時間刻みか、日刻みか、あるいは週刻みか...といったどういった単位で刻むのかを選択することができます。
分ベースなら最終的に以下のように。
時間ベースなら以下のように...
日付ベースなら毎日決まった時刻(1時間の振れ幅はありそう)に....
週ベースなら以下のような感じで毎週きまった曜日の特定時刻(1時間の振れ幅はありそう...)
などが設定できそうです。
いったん試しに毎分(動作確認のため)でやってみました。
すると...?
おー...
毎分通知が出てきましたね...!
あとはお気に入りの時間設定でトリガーを設定して、メッセージ内容も適当に変更すれば完璧です!
メッセージ内容の編集について
最後に簡単にメッセージ内容の編集についても触れておこうと思います。
メッセージの内容は以下です。
const contents = `<@U01FG389ZAQ> テスト`
例えばもうちょっと汎用性をあげると...
試しに以下のようにしてみます。
const contents = `
<!here> お疲れ様です。
本日も18時になりました。
日報を忘れず、早めの退勤をお願いいたします。
日報に関しては以下URLをご参照ください。
https://tektektech.com/
`
こうすることで、hereにメンションをつけ、リンク付与も可能です。
少し待ってみると...?
上記のようになるため、これを毎日18時に飛ばす...といった感じにすると良さげですね。
ただ、一点だけ、トリガーでの設定では多少振れ幅(設定できるのが6 ~ 7時)が出てきそうなので、ちょっと文面は考えたほうがいいかもしれないですね...
まとめ
さて、今回は定期的にSlackへ通知を送るようにGASで設定してみました。
比較的実装自体は10分程度でできたので、楽ちんですね....!
ただ、触ってみた感じGASの定期実行だと自由度は低そう...
1時間の振れ幅があって正確な時間指定が難しいんですね...
Googleカレンダーとの連携とかすればしっかりできそうですが、カレンダー側にも予定追加しないと行けなさそうな予感...(あんまりみてませんが...)
とすると、トリガーでの関数実行は毎分実行とかにして、ある特定の日時になった時だけ送信処理をするよう、スクリプトで制御...といった感じにしてメッセージ送信する形がいいのかな...?
まぁ、何かしら対策は取れそうですが、今回はこのくらいにしておきます...!
是非!活用してみてください!
それでわ!