【Google Apps Script】その20　今日の予定をChatworkに一括通知する

この記事は[Google Apps Scriptを実例交えて基礎からざっくり学ぶ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas_beginner)　20日目の記事です。

本アドベントカレンダーは@rt_pの個人プロジェクトですが、筆者は[Ateam Brides Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/a-t-brides)にも参加しています。そちらでも出張版記事を書いているので、覗いていただけると嬉しいです。

# はじめに

あれ？今日の予定って何があったっけ？という時に、いちいちカレンダー開くの手間ですよね。
ということで、自分のカレンダーに登録されている今日の予定を朝一でChatworkに通知してみます。

![cw.png](https://qiita-image-store.s3.amazonaws.com/0/199678/7bf8a9d9-b900-7d43-99be-9c316d0d8f97.png)

# ダミーの予定登録

もしGoogleカレンダーに予定が何も登録されていない場合、適当に予定を登録しておきましょう。

![calendar.png](https://qiita-image-store.s3.amazonaws.com/0/199678/ad50f37d-2e58-7817-3128-db7e4409d500.png)

# GASファイルの作成

今回はスプレッドシートを使う必要がないのでGoogle Apps Scriptファイルを直接作成しましょう。
Googleドライブの*新規作成→その他*から作成できます。
見つからなければ＋アプリを追加から探してください。

以下コードを入力しましょう。
*承認が必要です*メッセージが出た際の対処法が分からない場合は
[アドベントカレンダー1日目のHello, world!記事](https://qiita.com/rf_p/items/0535ec495df8f9d2b894)をご参照ください。

```javascript:today_events.gs
function myFunction() {
  var events = CalendarApp.getDefaultCalendar().getEventsForDay(new Date());
  var body = '';
  for (var i in events) {
    var event = events[i];
    body += '【' + event.getStartTime() + '～' + event.getEndTime() + '】' + event.getTitle() + "\r\n";
  }
  if (body) {
    var subject = '本日の予定';
    postToChatworkMessage(subject, body);
  }
}

// chatworkにメッセージ投稿
function postToChatworkMessage(subject, body) {
  var roomId = 'YOUR_ROOM_ID'; // ここに投稿したい部屋のIDを入力
  var token = 'YOUR_TOKEN'; // ここにトークンを入力
  var body  = '[info][title]' + subject + '[/title]' + body + '[/info]';
  var payload = {
    'body': body
  }
  var headers = {
    'X-ChatWorkToken': token
  }
  var options = {
    'method' : 'POST',
    'payload' : payload,
    'headers' : headers
  }
  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}
```

> getDefaultCalendar() 

https://developers.google.com/apps-script/reference/calendar/calendar-app#getDefaultCalendar()

自身のデフォルトカレンダーを取得します。

> getEventsForDay(date) 

https://developers.google.com/apps-script/reference/calendar/calendar#getEventsForDay(Date)

指定した日付の予定を全て取得します。
今回は今日の日付を渡したので、今日の全ての予定が返ってきたわけですね。

```javascript
  var roomId = 'YOUR_ROOM_ID'; // ここに投稿したい部屋のIDを入力
  var token = 'YOUR_TOKEN'; // ここにトークンを入力
```

roomIdは部屋のIDです。URLの#!ridXXXXXとなっている、rid以降の数値です。
Chatworkトークンの取得方法は[16日目の記事](https://qiita.com/rf_p/items/3e20e4114a1182deb7bc)を参照してください。

`myFunction()`実行時にChatworkに通知が来たら成功です。

![cw.png](https://qiita-image-store.s3.amazonaws.com/0/199678/7bf8a9d9-b900-7d43-99be-9c316d0d8f97.png)

# 定期実行の設定

スクリプトエディタのストップウォッチマークをクリック。
日タイマーで、朝8時台に通知するようにしましょうか。

![trigger.png](https://qiita-image-store.s3.amazonaws.com/0/199678/8beaad49-8f30-95e7-ac3d-ea8846044527.png)

これで毎朝8時台に自動通知されるようになったはずです。

# おわりに

結構簡単な手順で予定通知システムを作ることができました。
組織内で他のユーザーの予定を通知するには以下関数を使えばいけるようです。ご活用ください。

> subscribeToCalendar(id) 

https://developers.google.com/apps-script/reference/calendar/calendar-app#subscribeToCalendar(String)

# 明日

[【Google Apps Script】その21　指定時刻にメッセージを自動投稿するChatwork botを作る](https://qiita.com/rf_p/items/66108768bbbc61b04168)
となります。
毎日10時に特定メッセージをChatworkに通知したい、とかありますよね。そちらをGASで実現します。

前の記事
[【Google Apps Script】その19　Chatwork Webhookを使い、スプレッドシートに発言を溜める](https://qiita.com/rf_p/items/897d93f7beca83cd5902)
次の記事
[【Google Apps Script】その21　指定時刻にメッセージを自動投稿するChatwork botを作る](https://qiita.com/rf_p/items/66108768bbbc61b04168)