🐣
Googleカレンダーに休暇予定があればSlackに通知する
背景・概要
自分以外のメンバーの有休を失念してしまうことがあります。カレンダーに入れ忘れている場合、気づかないことが多いです。
そのため、特定のGoogleカレンダーに登録された休日情報をSlackに通知させるGASを作りました。
Googleカレンダーから当日の予定を取得し、予定に「全休」、「午前休」、「午後休」という文字列が含まれている場合に、Slackに通知させる設定です。
ただし、土日や祝日と、休みの予定が入っていない場合は、Slackの通知はスキップされます。
Slack
■有休をお知らせします
【カレンダー1】【全休】全休:田中
【カレンダー2】【全休】全休:本田
【カレンダー3】【午後休】午後休:遠藤
GAS
- トリガーを毎日特定の時間に動くように設定してください。土日祝はスキップする設定になっています。
- 金曜日に通知されますが、金曜日が祝日の場合は木曜日に通知されます。
- カレンダーIDとSlackのWebhook URLを定数に設定してください。
- 複数のGoogleカレンダーを設定できます。
function postHolidaySchedule() {
if (!isBusinessDay()) {
return;
}
const calendarIds = [
"calendarId1を入れる",
"calendarId2を入れる",
"calendarId3を入れる"
]; // Add more calendar IDs here.
const slackWebhookUrl = "slackWebhookUrlを入れる";
const slackPayload = {
text: "■有休をお知らせします\n",
link_names: 1,
};
let hasHolidays = false;
for (const calendarId of calendarIds) {
const calendar = CalendarApp.getCalendarById(calendarId);
const today = new Date();
const events = calendar.getEventsForDay(today);
for (let i = 0; i < events.length; i++) {
const title = events[i].getTitle();
if (title.includes("全休")) {
slackPayload.text += `【${calendar.getName()}】【全休】${title}\n`;
hasHolidays = true;
} else if (title.includes("午前休")) {
slackPayload.text += `【${calendar.getName()}】【午前休】${title}\n`;
hasHolidays = true;
} else if (title.includes("午後休")) {
slackPayload.text += `【${calendar.getName()}】【午後休】${title}\n`;
hasHolidays = true;
}
}
}
if (!hasHolidays) {
return;
}
const options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(slackPayload),
};
UrlFetchApp.fetch(slackWebhookUrl, options);
}
function isBusinessDay() {
const today = new Date();
const dayOfWeek = today.getDay();
// 土日は営業日ではない
if (dayOfWeek === 0 || dayOfWeek === 6) {
return false;
}
// 祝日は営業日ではない
const calendar = CalendarApp.getCalendarById(
"ja.japanese#holiday@group.v.calendar.google.com"
);
const holidays = calendar.getEventsForDay(today);
if (holidays.length > 0) {
return false;
}
// 営業日の場合はtrueを返す
return true;
}
Discussion