googleカレンダー情報をLINEで取得＆送信

#LINE公式でオンラインサロン作ってみたい
[LINE公式でオンラインサロン作ってみたい](https://qiita.com/misa_m/items/14681c13e8644bf4f166)
の続きになります。

#LINEオンラインサロン全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/48ad9bc8-ccfc-f7f1-d7e8-2aed7b6e47e8.png)

・サブクス決済は自動でLINE上で行える
・フリーで質問・相談のチャットが可能
・チャットでは解決できない事をzoomなどでオンライン個別相談を行う
・対象ユーザーに向けてお知らせ一斉送信

上記の機能を考えました。
技術的な流れとしては
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/c41f803e-4f42-16ba-4099-198b663cdd7a.png)
・LINE Payのサブクス決済をLINE上で実装
・Google Calendar API(webAPI)からカレンダー情報を取得
・LINE Messaging APIを利用して、空きスケジュールなどの情報を対象ユーザーに向けて一斉送信

それでは、google calendar APIからスケジュール情報を取得＆LINEへ送信の構築部分を紹介します。

#google calendar APIからスケジュール取得
普段からgoogle calendarをよく利用しています。
google calendarにプライベートと仕事のスケジュールを全て管理しておき、お客様はスケジュールの空いている所にピンポイントで予約を入れられるので、スケジュール調整が自動化出来てとても便利です。

そこで、node.jsでgoogle calendar情報を取得させるコードを見つけたので実装してみる事にしました。
node.jsでgoogle calendarを扱う前に、Google APIsで認証キーの発行が必要です。

#Google APIsでAPIキー発行
公式ドキュメントのEnable the Google Calendar APIボタンをクリックしてキーを発行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/bb0b27ea-e8c5-e928-15d5-7c196b1a511d.png)


#Google API でプロジェクト新規作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/aa06fa64-bd88-892a-884e-33f6dd8a071f.png)

#プロジェクト名入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/bcd34221-690b-260d-61e3-33fc1e2951bb.png)

#APIを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/3d285006-c40f-58b6-2d34-7459c8e89433.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/82e90c8b-9dab-4acc-99cc-998fada3d112.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/51447e10-7cd9-229d-4e8c-eadf00a04d02.png)

有効にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/326e3e95-7953-6bd4-3ce3-bf5d3d434120.png)

#OAuth同意
外部を選択して作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/76abe5c0-e318-65e6-0f80-283a275fcd68.png)


#認証情報作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/58eb979d-322e-20e4-095b-f737171f2bce.png)

今回、node.jsを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/a9d1d45f-d6e8-f61e-dc51-06c0232b3505.png)

任意のサービスアカウント名を入力します。
ロールはオーナーにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/f03b7b0c-2ddb-58d5-736f-493b4cc0cba2.png)

秘密キーが自動ダウンロードされました。

【認証情報】の中にサービスアカウントが増えています。
クリックしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/eb8b0ae7-1fd7-ae8f-7536-e77732088cdb.png)

アクティブになっているのでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/f4d6d402-cde1-6264-fd9a-56e6884dd5e6.png)

#google calendarでのアクセス権限
カレンダーへアクセスして、歯車アイコンをクリックして設定をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/06206ee8-871b-5c5e-1dd9-89bba7f4e5a2.png)

左サイドバーの【特定のユーザーと共有】をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/5ac9d2af-c008-eba2-211c-2ab60df30e78.png)

ユーザーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/0e64c97c-4d2b-d6b7-2403-29d05622abe0.png)

先ほどのサービスアカウント名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/ea1c934e-85d8-f672-c876-83534244f0fe.png)

#node.jsを利用
パッケージを利用します。

```
npm install node-google-calendar
```

configファイル作成

```javascript


// ----------------------
// ④ タイムゾーン（日本）
// ----------------------
const TIMEZONE = 'UTC+09:00';

module.exports.calendarUrl = CALENDAR_URL;
module.exports.serviceAcctId = SERVICE_ACCT_ID;
module.exports.calendarId = CALENDAR_ID;
module.exports.key = KEY;
module.exports.timezone = TIMEZONE;
```


カレンダーの統合に書いてあるURLを②と③にいれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/d39f79cc-59f2-df86-a44f-08f50c31a3dd.png)


```javascript
/*************************
  sample.js
 *************************/
// ----------------------
// パッケージのインスタンス生成
// ----------------------
var Calendar = require('node-google-calendar'),
    config = require('./credentials/calendar-config'),
    calId = config.calendarId.myCal;

var cal = new Calendar(config);

// ----------------------
// カレンダーイベントの取得
// ----------------------

// 取得する対象期間を指定
// timeMinからtimeMaxの間のカレンダーイベントが取得される
var params = {
    timeMin: '2020-12-01T06:00:00+09:00',
    timeMax: '2020-12-31T06:00:00+09:00',
}
cal.Events.list(calId, params)
    .then(calEvents => {
        console.log(calEvents);
    })
    .catch(err => {
        console.log(err.message);
    });
```
timeの箇所を取得したい期間にします。


#実際に取得をしたデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/fdec88a8-b0dd-3cc6-6dd4-b8b4d05ee555.png)

#他にも色々出来る
カレンダー情報を受け取ったのですが、削除したり追加したり色々出来るみたいです。

Enentsの構造についてのリファレンスを見つけました。
[Google Calendar API Enents](https://developers.google.com/calendar/v3/reference/events)

また、今回はcal.Event.listとしたのですが、
listの部分をdeleteやgetなど、色々変える事でgoogleカレンダーを便利に使えそうです。
[Google Calendar API Methods](https://developers.google.com/calendar/v3/reference/events#methods)

#せっかくなので、LINEにデータを送りたい
取得されるcalEventsはJSON形式なので、LINEに送りたいと思って実装したところ

```javascript
let msg = calEvents;
```
カレンダーから取得した値をメッセージに代入できなくてはまりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/5b971629-a44e-1999-aa26-cfe239429107.png)

調べると

```javascript
console.log(JSON.stringify(value));
```
このような形式で書いてあげると解決できるみたいです。無事、出力されました。
参考サイト：[console.logでJSON形式の値が[object Object]になる時](https://qiita.com/camomile_cafe/items/d4e8ea250bf0ac521c2d)

LINE botへメッセージを送る時も、【text: JSON.stringify(msg) 】と記述をしたところ、無事チャットボットに返答がありました！
【text: msg】だとbotに情報が何も送れず、この部分の解決にとても苦労しました。


```javascript
cal.Events.list(calId, params)
        .then(calEvents => {
            console.log(calEvents);
            let msg = calEvents;
            console.log(JSON.stringify(msg));
            return client.replyMessage(event.replyToken, {
                type: 'text',
                text: JSON.stringify(msg) 
            });
        })
        .catch(err => {
            console.log(err.message);
        });
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/48147c3d-c759-6f86-e8e1-9c7e7537da34.png)

LINEへカレンダー情報が送れることが分かったので

#特定LINEユーザーへ送信
LINE公式アカウントでオンラインサロンを運用する際に、空きスケジュールを自動取得、一斉送信という仕組みもあっても良いのかなと思ったので、LINE Messaging APIのmulticastという機能も使ってみる事にしました。

replayMessageをmulticastへ変更しています。

```javascript
cal.Events.list(calId, params)
        .then(calEvents => {
            console.log(calEvents);
            let msg = calEvents;
            console.log(JSON.stringify(msg));
            // return client.replyMessage(event.replyToken, {
            return client.multicast(['USER-ID'], {
                type: 'text',
                text: JSON.stringify(msg) //← ここに入れた言葉が実際に返信されます
            });
        })
        .catch(err => {
            console.log(err.message);
        });
```

#まとめ
JSONで受けとったデータがそのまま送られているので、必要な情報だけを送れるように引き続き考察を続けていきたいと思います。

今回、Google Calendar APIを利用する為に参考にしたサイトは以下です。
とても分かりやすく、エラーなく実装が行えました。
[node.jsでGoogleカレンダーを操作する方法。nodeパッケージ「node-google-calendar」使用。](https://resowork.com/ggl-calendar-via-nodejs)

googleカレンダーから情報を取得する方法は
[LINE公式でオンラインサロン作ってみたい](https://qiita.com/misa_m/items/14681c13e8644bf4f166)こちらに書きました