LoginSignup
14
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-17

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のリアクションで使うテキスト絵文字を作成する

14
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
19