祝日や会社の休日に起動しないSlack通知bot
はじめに
平日の18時に行っている夕会用に、開始時間になると曜日ごとのファシリテータをお知らせするbotを運用中。
土日祝日と会社指定の休日は通知飛ばないようにしてます。
祝日判定のためにGoogleAppsScriptとGoogleカレンダーを利用してます。
Googleカレンダーに用意されている日本の祝日カレンダーで祝日を、別に用意した会社の休日カレンダーで年末年始や夏季休暇に対応しています。
コード
function onOpen() { if (isHoliday()) { return } deleteAllTriggers(); setupTriggers(); } function deleteAllTriggers() { var allTriggers = ScriptApp.getProjectTriggers(); for(var i=0; i < allTriggers.length; i++) { ScriptApp.deleteTrigger(allTriggers[i]); } } function getFormatedDate(time){ var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; var date = now.getDate(); month = ("0" + month).slice(-2); date = ("0" + date).slice(-2); var strDate = year + "/" + month + "/" + date + " " + time; return strDate; } function setupTriggers() { // 通知時間の設定 var trigger = new Date(getFormatedDate("18:00")); var onChangeTrigger = ScriptApp.newTrigger("notfy") .timeBased() .at(trigger) .create(); //全トリガー削除するので再設定 var onChangeTrigger = ScriptApp.newTrigger("onOpen") .timeBased() .atHour(10) .everyDays(1) .create(); } function notfy() { var facilitator = getTodayFacilitator(); postSlack(facilitator); } function isHoliday() { var japanHoliday = CalendarApp.getCalendarsByName('日本の祝日'); var companyHoliday = CalendarApp.getCalendarsByName('会社の休日'); var holidays = japanHoliday[0].getEventsForDay(new Date()) + companyHoliday[0].getEventsForDay(new Date()) ; return (holidays != ''); } function getMembers() { var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('member').getRange(2, 1, 5, 2).getValues(); var members = {'日':'', '月':'', '火':'', '水':'', '木':'', '金':'', '土':''}; for (var i = 0; i < 5; i++) { var youbi = values[i][0]; members[youbi] = values[i][1]; } return members } function getTodayFacilitator() { var now = new Date(); var week = ['日', '月', '火', '水', '木', '金', '土']; var members = getMembers(); var facilitator = members[week[now.getDay()]]; return facilitator; } // send to slack function postSlack(name) { if (name == "") return; var payload = { "text" : "<!here> " + "今日の当番は" + name + "ですよ", "channel" : "#general" // 表示名やアイコンはお好みで } var options = { "method" : "POST", "payload" : JSON.stringify(payload) } var url = "https://hooks.slack.com/services/hoge/fuga/piyo"; // 各自のURL var response = UrlFetchApp.fetch(url, options); var content = response.getContentText("UTF-8"); }
ポイント
使うまで知らなかったけど、GoogleAppsScriptの時間起動トリガーだと毎日18時っていう指定ができませんでした。
近いのは、毎日18時〜19時の間に起動するというトリガーか特定日の18時というトリガーです。
仕方ないので、毎日10時〜11時の間に起動して、setupTriggers()
という関数でその日の18時のトリガーを設定してます。
さらに面倒なことにトリガーを区別するのが大変ぽかったので、一回全部消してから全部設定し直すようにしてます。