Google Apps ScriptでSlackに毎朝Google Calendarの予定を流す

予定が入っているのを忘れて困ったことになったので、毎朝Slackにその日と次の日の予定を流すようにしてみました。 初めてGoogle Apps Script触ったけど、サーバ無しでもcronっぽいことできるし日常を便利にするのにすごく使えそう。

下のコードを日タイマーで午前6時〜7時に動くように設定して終了! (calendarIdはGoogle Calendarの設定を開いて、"カレンダーのアドレス"を見る。Slackの投稿先URLはIncoming Webhookの設定してURL見る。)

function notifyEvents() {
  var today = new Date();
  var tomorrow = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
  _notify(_text(today) + "\n\n" + _text(tomorrow));
}

function _events(date) {
  var calendarId = 'xxxxxxxxxx';
  var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(date);
  var results = [];
  for (var i = 0, l = events.length; i < l; i++) {
    var event = events[i];
    var s = '';
    if (!event.isAllDayEvent()) {
      s = _hhmm(event.getStartTime()) + '-' + _hhmm(event.getEndTime());
    }
    results.push(event.getTitle() + s);
  }
  return results;
}

function _hhmm(date) {
  return Utilities.formatDate(date, 'GMT+0900', 'HH:mm');
}

function _notify(text) {
  var payload = {
    text: text,
    channel: '#general',
    username: '今日と明日の予定',
    icon_emoji: ':calendar:'
  }
  var url = 'https://hooks.slack.com/services/xxxxxxxxxx/xxxxxxxxxx/xxxxxxxxxx';
  UrlFetchApp.fetch(url, { method: 'POST', payload: JSON.stringify(payload) });
}

function _text(date) {
  var events = _events(date);
  var mmdd = Utilities.formatDate(date, 'GMT+0900', 'MM/dd');
  var text;
  if (events.length > 0) {
    text = mmdd + "の予定:\n" + events.join("\n")
  } else {
    text = mmdd + 'の予定はありません'
  }
  return text;
}