#これは
Slackワークスペース内のメンバーが誕生日を迎えると、通知が飛ぶようにしました。
#きっかけ
中の人はビジネスサイドですが、思いがけず開発部の方からUdemyの講座をいただいたので、そちらの内容を応用して何か作ってみようと思いました。
#使ったもの
- Slack Incoming Webhook
- Googleカレンダー
- Google Apps Script(GAS)
#やったこと
##Slack Incoming Webhook
Slackプロフィール>「その他管理項目」>「ワークスペースをカスタマイズ」
「App管理」>「カスタムインテグレーション」にIncomong Webhookを追加
「カスタムインテグレーション」>「インテグレーションの設定」のWebhook URLを後ほどGASに埋め込みます。
「インテグレーションの設定」では、通知される時の名前やアイコンも編集することができます。
##Googleカレンダー
誕生日用のカレンダーを作成しました。こちらの「設定と共有」を開くと、
カレンダーIDが確認できます。こちらも後ほどGASに埋め込みます。
##GAS
###カレンダー情報の取得
ここでカレンダーIDを指定することにより、特定のカレンダー情報を取得します。
function notifySlack() {
//お誕生日カレンダー情報の取得
const CALENDAR_ID = 'hogehogehogehogehogehogek@group.calendar.google.com';
var Calendar = CalendarApp.getCalendarById(CALENDAR_ID);
###取得する情報の詳細
//今日の日付
var startDate = new Date();
//「誕生日」を検索文字列に指定
var optionsforGas = {
search: '誕生日'
}
var BirthdayEvents = Calendar.getEventsForDay(startDate,optionsforGas);
var url = 'https://hooks.slack.com/services/hoge/hogehogehogehogehogehoge'
var title = '';
for(var i in BirthdayEvents) {
title = BirthdayEvents[i].getTitle();
}
###通知の設定
誕生日のメンバーがいる日だけに通知が飛ぶように条件分岐させる(最初はこれをやっていなかったので、「今日は」だけの虚無通知が飛ぶ事態が起きていました)。
if(BirthdayEvents.length != 0){
var text = '今日は'
//Incoming webhookからslackに送信する値
var payload = {
'username': '***',
'text': text += title,
'channel':'#develop'
};
var optionsforSlack = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload)
};
UrlFetchApp.fetch(url, optionsforSlack);
}
}
###トリガーを設定する
GAS>編集>「現在のプロジェクトのトリガー」を選択
イベントソースは、ひとまず「時間主導型」にしましたが、プルダウンで「カレンダーから」も選べるのでそっちでもいいはず(違いはよく分かっていない)。
#学んだこと
ここ、最初は以下のように記述していました。
これだと、誕生日の人がいない場合でも変数が動いてしまうから変数ごとifで囲った方が無駄な処理がなくて良い(らしい)。
var text = '今日は'
//Incoming webhookからslackに送信する値
var payload = {
'username': '***',
'text': text += title,
'channel':'#develop'
};
var optionsforSlack = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(payload)
};
if(BirthdayEvents.length != 0){
UrlFetchApp.fetch(url, options);
}
#参考資料
いろんな人に教わりながらとりあえず手を動かしたみたいなところがあるので、また頭を整理して後日追記する予定です。