GASを使ってGoogle CalendarとSlack Statusを同期する

  • 12
    いいね
  • 0
    コメント

Slackに追加された新機能 Status が API を使って更新できるみたいなので、
Google App Script を使って Google Calendar と同期してみました。

概要

当日のイベントを全て取得し、開始時間と終了時間と現在時刻を比較して、
現在の予定を取得。

取得した予定名を見て特定の文字列が含まれているかどうかで
予定の種類を判別し以下のemojiを設定しています。

休暇(:kyuuka:) 会議中(:kaigi_tyu:) 外出中(:gaishutsu_tyu:) その他(:nankashitemasu:)
休暇.png 会議中.png 外出中.png なんか_してます.png

休暇のみ、終日イベントで設定することが多いので
終日イベントかつ休暇の文字が含まれているかで判定しています。

絵文字は以下のサイトで作成しました(下記サイトにはかなりお世話になってます!)
絵文字ジェネレーター

コード

GoogleCalendarSyncSlackStatus.gs
var calendarId = "Calendar ID を入力";
var slackToken = "Slack API Token を入力"

function onTrigger() {

  var event = getCurrentEvent(calendarId);
  updateSlackStatus(event);

}

/* 
 * 指定のカレンダーから現在時刻のイベントを取得する
 */
function getCurrentEvent(calendarId) {

  var now = new Date();
  var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(now);

  Logger.log(events)

  var currentEvent = {
    emoji: ":smile:",
    text: ""
  };
  if (events && events.length > 0) {
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      if (event.isAllDayEvent()) {
        // 終日イベントの場合

        if(/休暇/.test(event.getTitle())){
          // 休暇 が含まれている場合
          currentEvent.text = event.getTitle();
          currentEvent.emoji = ":kyuuka:"
          break;
        }
      } else {
        var start = new Date(event.getStartTime())
        var end   = new Date(event.getEndTime())

        if(start < now && now < end){
          // 現在時刻がイベント中の場合
          var title = event.getTitle();
          var emoji = "";

          if(/(会議|MTG|mtg|打ち合わせ|定例)/.test(title)){
            // 会議中 の絵文字を設定
            emoji = ":kaigi_tyu:";
          }else if(/(外出|訪問)/.test(title)){
            // 外出中 の絵文字を設定
            emoji = ":gaishutsu_tyu:";
          }else{
            // なんかしてます の絵文字を設定
            emoji = ":nankashitemasu:";
          }

          currentEvent.text  = title;
          currentEvent.emoji = emoji;

          break;          
        }
      }
    }
  } else {
    Logger.log('No events found.');
  }

  return currentEvent;
}

function updateSlackStatus(event){
  try {

    var profile =  {
        "status_emoji": event.emoji,
        "status_text": event.text
    }

    // Slack APIの仕様に従ってURL enociding する
    var encodedProfile = encodeURIComponent(JSON.stringify(profile))

    // Slack API を叩いてprofileを更新する
    var result = UrlFetchApp.fetch("https://slack.com/api/users.profile.set?token=" + slackToken + "&profile=" + encodedProfile);

    Logger.log(result)

  } catch(ex) {
    Logger.log(ex)
  }
}

Slack APIを叩くところ、POSTで叩きたかったが何故かうまくいかず。。。。

使用方法

適当なGASプロジェクトを作成し、上記コードを貼り付け、
編集 > 現在のプロジェクトのトリガー から onTrigger を 1分ごとに実行するように設定すれば動くと思います。。。

https://api.slack.com/custom-integrations/legacy-tokens
Slack API を叩くのに必要なtokenは上記URLから生成することができます

Google Calendar ID は普通に Google アカウントのメールアドレスでOKです

参考にしたものとか

Slack の Status emoji を API で変更する
Slackのリアクションで使うテキスト絵文字を作成する