今日の予定を応答するLINE BOT

# 今日の予定を応答するLINE BOT

<img width="30%" title="line" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/bf9951c7-e94b-1c99-de1e-ed763c7dad44.png">

## 処理の流れ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/564df2a1-79df-1026-bdf0-4e7abd571688.png)

## やること

1. LINE Developersに登録し、　ボットを作成する
    * https://developers.line.biz/ja/docs/messaging-api/building-bot/
1. 連携するGoogle CalendarIDを取得する
1. Google Apps Scriptを作成する
1. Google Apps Scriptを公開する
1. LINE DevelopersコンソールでボットのWebhook URLを登録する


## ポイント説明

### LINE Developersに登録し、　ボットを作成する

ここは、すでに数々のサイトで公開されているので、先人の知恵を参考にしてください。
ここで、Channel Access Tokenを取得してください

#### 連携するGoogle CalendarIDを取得する

1. Googleカレンダーにアクセスして、設定を開く
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/09285109-e117-20b8-da36-715a84bd9ab8.png)
1. カレンダーの統合からカレンダーIDを取得
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/8cee86f3-7167-6515-b2d3-77291859a844.png)



### Google Apps Scriptを作成する


```javascript:messaging_api.gs
// LINE Developers : Messaging API -> Channel access token
const ACCESS_TOKEN = ''
// Google Calendar : 設定 -> カレンダー ID
const CALENDAR_ID = ''
const quickReply = {
  items: [
    {
      type: 'action',
      action: {
        type: 'message',
        label: '今日の予定を確認する',
        text: '今日の予定を教えて'
      }
    },
  ]
}
const reply = ({replyToken, messages}) => {
  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json; charset=UTF-8',
      Authorization: `Bearer ${ACCESS_TOKEN}`
    },
    payload: JSON.stringify({replyToken, messages})
  })
}

const doPost = (e) => {
  const requestContent = JSON.parse(e.postData.contents).events[0]
  if (requestContent.message?.text === '今日の予定を教えて') actionToday({replyToken: requestContent.replyToken})

  reply({
      replyToken: requestContent.replyToken,
      messages: [
        {
          type: 'text',
          text: 'まだ、今日の予定を確認することしかできないよ。'
        },
        {
          type: 'sticker',
          packageId: '6136',
          stickerId: '10551397',
          quickReply,
        }
      ]
  })
}

const actionToday = ({replyToken}) => {
  const calender = CalendarApp.getCalendarById(CALENDAR_ID)
  const events = calender.getEventsForDay(new Date())
  reply({
    replyToken,
    messages: [
      {
        type: 'text',
        text: events.length ? events.map(event => {
          const hour = (event.getEndTime().getTime() - event.getStartTime().getTime()) / 3600000
          return `【${hour === 24 && event.getStartTime().getHours() === 9 ? '終日' :
              [
                Utilities.formatDate(event.getStartTime(), 'Asia/Tokyo', 'HH:mm'),
                Utilities.formatDate(event.getEndTime(), 'Asia/Tokyo', 'HH:mm'),
              ].join(' - ') + ` (${hour} hour)`
            }】${event.getTitle()}`
        }).join('\n') : '今日の予定はありません\n気分転換にランニングはどうですか？',
      },
      {
        type: 'sticker',
        ...events.length ? {packageId: '8515', stickerId: '16581265'} 
          : {packageId: '8515', stickerId: '16581246'},
        quickReply,
      }
    ]
  })
}

```


### Google Apps Scriptを公開する

1. デプロイ -> 新しいデプロイ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/31308615-18e2-2b31-22f0-167d89e1d53d.png)
1. 作成後に「ウェブアプリURL」を取得


### LINE Developersコンソールでボットの Webhook URLを登録する

1. 上記で取得した、ウェブアプリURLを登録、Use webhookをonに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282054/63d0e51d-6fe2-326f-c055-ee6e2cc65959.png)


## 感想

これだけだと、あまり使えないので、カレンダー登録機能など今後拡張していきます。
自分だけのBOTっていうのがやっぱり愛着湧いて楽しかったです。

何より、試しに作ってみるのは楽しかったです！