LineBotでGoogleカレンダーの予定を通知する

##はじめに
最近、LineBotの作り方を勉強したいですｗ。
ここでは、他者のブログから学んだことをやりました。作り方とコードを再整理しました。
今回はLINE APIの一つであるMessaging APIとGoogle Apps Scriptを使って、LINE経由でgoogleカレンダ上の予定を自動で通知させます。

## 1.LineBotを作成する
[LINE公式アカウント（旧ライン＠）の作り方](https://note.com/climate_culture/n/ne288dc168069) を参照してください。

## 2.GoogleカレンダーIDを取得する
Googleカレンダー【設定】 → 【マイカレンダーの設定】 → 【カレンダーの統合】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109922/b8a2d6b8-d731-62a3-9f02-27af7a7fd02f.png)

ここまで通知Botに必要な項目3つすべてを取得しました。
**Your user ID**
**チャンネルアクセストークン**
**カレンダーID**

## 3.イベント通知LineBotの実装
Google Apps Scriptを新規作成して、以下のコードを貼り付けて、``access_token``　``user_id ``　``calendar_id ``の値を書きます。

```js
// LINE Messaging API: Channel access token
const access_token = '';
// LINE Your user ID
const user_id = '';
// Set your google calendar ID
const calendar_id = '';

function getGoogleCalendar() {
  var today = new Date();

  var myCalendar = CalendarApp.getCalendarById(calendar_id);

  var myEvents = myCalendar.getEventsForDay(today);

  var message = [];

  if (myEvents.length == 0) {
    message.push('There are no events today');
  } else {
    message.push('There are ' + myEvents.length + ' events today\n');
    myEvents.forEach(function (event) {
      var eventStartTime = event.getStartTime();
      var eventEndTime = event.getEndTime();
      eventStartTime = Utilities.formatDate(eventStartTime, 'JST', 'HH:mm');
      eventEndTime = Utilities.formatDate(eventEndTime, 'JST', 'HH:mm');
      if (event.getTitle()) {
        message.push(
          '\n' +
            event.getTitle() +
            '\n' +
            '今日 from ' +
            eventStartTime +
            ' to ' +
            eventEndTime +
            '\n'
        );
      }
      if (event.getDescription()) {
        message.push(event.getDescription() + '\n');
      }
    });
    message.push('https://calendar.google.com/calendar/u/0/gp?hl=ja');
  }

  message = message.join('');

  return postMessage(message);
}

// method for post message to LINE
function postMessage(message) {
  // var url = 'https://api.line.me/v2/bot/message/push'; // Send broadcast message API (all following users without user_id)
  var url = 'https://api.line.me/v2/bot/message/broadcast';  // Sends a push message to a user, group, or room API

  var headers = {
    'Content-Type': 'application/json; charset=UTF-8',
    Authorization: 'Bearer ' + access_token,
  };

  var postData = {
    to: user_id,
    // to: user_id,
    messages: [
      {
        type: 'text',
        text: message,
      },
    ],
  };

  var options = {
    method: 'post',
    headers: headers,
    payload: JSON.stringify(postData),
  };

  return UrlFetchApp.fetch(url, options);
}
```

注：全てのフォロワーに送りたい場合、対象IDがいらないので、53と61行を代わりに52と62行のコードを使える。

## 4.実行結果確認
スクリーンショット（イベントあり・なし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109922/01644dc4-2ea5-808d-b7a8-93c8498c4310.png)

## 5.自動的に投稿を実行される
トリガーをかける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109922/9df42244-3226-9d6f-31e8-51ac9be40422.png)

定時的に当日のイベントを投稿する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1109922/d41843f8-eb62-3cc7-e1f0-9ec81e1a2a5b.png)

## 6.Source Code (GitHub)
https://github.com/peepa857/LineBot-GoogleCalendar

## 参照サイト
https://note.com/climate_culture/n/n61c639b25357

https://developers.line.biz/ja/reference/messaging-api/#messages