yuya-yuzen

GASでSlackが毎朝、その日の予定を教えてくれるようにしてみた

2020/08/10
2020/08/10

Google Apps Scriptを触ってみたいと思い、簡単なアウトプットをしてみました。
毎朝その日のGoogleカレンダーの予定を、Slackで通知してくれるようにしました。

手順

  1. SlackでIncoming WebHooksを登録する
  2. Google Apps Scriptを書く
  3. Googleカレンダーのデータを取得する
  4. 今日の予定を取得する
  5. 通知するメッセージを作成、整形する
  6. Slackにメッセージを投稿する
  7. トリガーを設定する

SlackでIncoming WebHooksを登録する

Slack内で、アプリを追加の所からIncoming WebHooksを登録します。
そこで得られた Webhook URL を後ほど使います。

Google Apps Scriptを書く

Googleカレンダーのデータを取得する

自分のGmailアドレスから、Googleカレンダーのデータを取得します。
そのデータを返す getCalender() という関数を作ります。

function getCalendar() {
  return CalendarApp.getCalendarById('xxxxxxxxx@gmail.com')
}

今日の予定を取得する

まず、今日の予定を返す getTodaySchedule() という関数を作ります。

function getTodaySchedule() {
  const cal = getCalendar();
  const date = new Date;
  const arrEvents = getEvents(cal, date);
  return makeMessage(arrEvents);
}

次に、指定された日の全てのイベントを返す getEvents() という関数を作ります。
(返している makeMessage() という関数については後ほど作ります。)

function getEvents(cal, date) {
  const events = cal.getEventsForDay(date)
  let arrEvents = []; 

  for (let i = 0; i < events.length; i++) {
    const title = events[i].getTitle();
    const startTime = formatTime(events[i].getStartTime());
    const endTime = formatTime(events[i].getEndTime());

    if (events[i].isAllDayEvent()) {
       arrEvents.push(" 終日:" + title);
    } else {
       arrEvents.push(" " + startTime + " ~ " + endTime + ":" + title);
    }
  }

  return arrEvents;
}

続いて、時間の表記をフォーマットして返す formatTime() という関数を作ります。

function formatTime(date) { 
  return Utilities.formatDate(date, 'JST', 'HH:mm');
}

通知するメッセージを作成、整形する

今日の予定のデータが得られたら、それを使って通知するメッセージを作成、整形します。
予定がない日のメッセージも入れて makeMessage() という関数を作ります。

function makeMessage(arrEvents) {
  if (arrEvents.length != 0) {
    const introduction = "おはようございます:sunny:\n今日の予定は以下の通りです。\n";
    const conclution = "\n今日も一日がんばりましょう:muscle:";
    return introduction + arrEvents.join("\n") + conclution;
  } else {
    return "今日は1つも用事がないよ!"
  }
}

Slackにメッセージを投稿する

それでは最後に、

  • 通知するメッセージ
  • 最初に得た Webhook URL

を使って、Slackに投稿するための main() という関数を作ります。

function main() {
  const username = 'todayScheduleBot';
  const icon = ':smiley_cat:';
  const jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : getTodaySchedule()
  };

  const payload = JSON.stringify(jsonData);
  const options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  const postUrl = 'https://hooks.slack.com/services/xxxxxxxxx';
  UrlFetchApp.fetch(postUrl, options);
}

トリガーを設定する

GASを書くエディタの時計マークをクリックすると、トリガーの設定画面が出てきます。
自分の場合は、「時間主導型」「日付ベース」「午前7時~8時」と設定しました。

これで毎朝、その日の予定を教えてくれるようになりました。

参考


Share:
ゆうや