🐣

Googleカレンダーに休暇予定があればSlackに通知する

2023/05/06に公開

背景・概要

自分以外のメンバーの有休を失念してしまうことがあります。カレンダーに入れ忘れている場合、気づかないことが多いです。
そのため、特定の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;
}


GitHubで編集を提案

Discussion