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

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

# 概要

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

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

|休暇(:kyuuka:)|会議中(:kaigi_tyu:)|外出中(:gaishutsu_tyu:)|その他(:nankashitemasu:)|
|:--:|:--:|:--:|:--:|
| ![休暇.png](https://qiita-image-store.s3.amazonaws.com/0/55219/46bcad86-0de0-da41-4258-86463089dca2.png)|![会議中.png](https://qiita-image-store.s3.amazonaws.com/0/55219/dc441b15-6a48-f929-2256-8d5c20e46716.png)| ![外出中.png](https://qiita-image-store.s3.amazonaws.com/0/55219/b09fa10a-bb9c-8925-6dea-a681018f8cff.png)| ![なんか_してます.png](https://qiita-image-store.s3.amazonaws.com/0/55219/9b5cde2f-8337-e558-c5d0-5ef0922e5bf6.png)|

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

絵文字は以下のサイトで作成しました(下記サイトにはかなりお世話になってます！)
[絵文字ジェネレーター](https://emoji.pine.moe)

# コード
```javascript: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 で変更する](http://qiita.com/tanjo/items/63fef4b66c020a067449)
[Slackのリアクションで使うテキスト絵文字を作成する](http://qiita.com/Will_meaning/items/ebfc5c02842c002acfab)