GASでGoolge Calendarの予定を通知するLINE Botを作ってみた

[Qiita株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qiita-inc)の8日目は @zumi0 が担当します！

https://qiita.com/advent-calendar/2022/qiita-inc

## はじめに
Google Calendarで予定管理をしているのですが、毎日終日どんな予定があるか通知してくれたら楽だなと思っていました。Google Calendarには既に1日の予定全部を通知してくれる機能はあるのですが、メールでの通知のみになっています...ちょっとメールで確認することが嫌だったので、今回GASとLINE Messaging APIを使って、Google Calendarの予定がLINEに飛んでくるようにしたいと思います！

## GASでGoolge Calendarの予定を通知するLINE Botを作ってみた
### LINE関連での準備
LINEで何かメッセージを送るために、まずはLINE Developesに登録して、アクセストークンとユーザーIDを取得する必要があります。

登録はこちらから行えます。

https://developers.line.biz/ja/

流れとしては、プロバイダとチャンネルの作成すると、その後アクセストークンとユーザIDを取得できるので、取得後友達登録をして完了です。私は、以下の記事を参考に進めました。

https://qiita.com/oimo23/items/11a0c38bbe1e297fb611

### スクリプトを書く
今回やりたいことを実現するために、大きく分けて3つの関数を用意しました。
- Google Calendarの予定を取得する
- 予定を整形してLINEに送るテキストを作成する
- LINEに通知する

#### Google Calendarの予定を取得する
カレンダーの予定を取得する自体は、そんなに難しくなく取得できます。
```js
const getCaledarSchedule = () => {
    // Day.jsというライブラリを使って、当日の日付を取得
    const today = dayjs.dayjs().toDate();
    
    // 日付を指定して、その日の予定を取得
    const calendar = CalendarApp.getDefaultCalendar();
    const events = calendar.getEventsForDay(today); 

    return events;
};
```

#### 予定を整形してLINEに送るテキストを作成する
取得したカレンダーの予定を使って、予定名や開始時間、終了時間をわかるようなテキストを作成する関数を用意しました。分が0詰めできていなかったり、終日予定の時間が変になってしまったので、そこは調整しています。

```js
const makeText = (event) => {
    // 予定名を取得
    const eventTitle = event.getTitle();

    // 予定の開始時間を取得する
    // 数値で返ってくるので、0を重ねられるようにしています
    const startHour = event.getStartTime().getHours();
    const startMinute = (event.getStartTime().getMinutes() == 0) ? '00' : String(event.getStartTime().getMinutes());

    // 予定の終了時間を取得する
    // 数値で返ってくるので、0を重ねられるようにしています
    const endHour = event.getEndTime().getHours();
    const endMinute = (event.getEndTime().getMinutes() == 0) ? '00' : String(event.getStartTime().getMinutes());

    const eventTime = startHour + ':' + startMinute + ' - ' + endHour + ':' + endMinute;

    // 終日予定の場合、0時から0時みたいになってしまうので、そこを終日予定に直す
    const text = (eventTime == '0:00 - 0:00') ?  eventTitle + '\n' + '終日予定' : eventTitle + '\n' + eventTime; 

    return text;
};
```

#### LINEに通知する
今まで作成してきた関数を使って、取得したカレンダーの予定をLINEで送ります。LINEで簡単なメッセージを送るだけなら、以下の関数で送ることができます。アクセストークンやユーザIDはプロパティ機能を使って保存・呼び出しを行います。やり方については以下の記事にまとめてあるので、良かったらご覧ください。

https://qiita.com/zumi0/items/85ca400d57f60728a7c7

```js
const sendMessage = () => {
    // 先ほど作成した関数でカレンダーの予定を取得する
    const events = getCaledarSchedule();
    let message = dayjs.dayjs().format('MM月DD日') + 'の予定一覧\n-------------------------\n';
    
    // 整形したテキストを一つのテキストにまとめる
    events.forEach((event, index, array) => {
        message += makeText(event) + '\n' + '-------------------------\n';
    });
    
    // アクセストークンやユーザIDはプロパティ機能を使って保存、呼び出しをする
    const accessToken = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN');
    const userId = PropertiesService.getScriptProperties().getProperty('USER_ID');
    const lineUrl = 'https://api.line.me/v2/bot/message/push';

    // LINEでメッセージを送る
    const options = {
      "headers": {
        "Content-Type": "application/json; charset=UTF-8",
        'Authorization': 'Bearer ' + accessToken,
      },
      "method": "post",
      "payload": JSON.stringify({
        "to": userId,
        "messages": [{
          "type": "text",
          "text": message,
        }]
      })
  };  
```

#### まとめ
最後に、これらの関数を毎日実行するように、GASの方で設定をすれば完了です！

定期実行のやり方は、GASのエディタの左サイドバーにあるトリガーからトリガーの追加を選択し、以下のように設定するだけです。今回の場合だと、午前7~8時に毎日関数が実行されるようになります。お好みの時間に変更してみてください！
![スクリーンショット 2022-12-06 23.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/13b1f54e-31fe-5030-7c6d-2131990c6664.png)

実際に送ったメッセージは、こんな感じです。
![LINE_capture_692028380.908756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/9491cfa3-6e68-8cd3-3eea-643a02743f59.jpeg)

### さいごに
いかがでしたでしょうか。今回は、GASでGoolge Calendarの予定を通知するLINE Botを作ってみました。GASはLINE　Botの作成だったり、Googleのサービスの連携が簡単なので、ぜひ興味ある方は試してみてください！

[Qiita株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qiita-inc)はまだまだ続きます！ぜひ購読登録して、明日以降の記事もチェックしてみてください！