LINE Notify + GoogleAppsScript + Googleカレンダーで明日の予定を絶対忘れない

# はじめに

最近毎日違った予定が入りすぎて明日の予定を忘れがちになってきてしまいました。
Googleカレンダーの明日の予定をまとめてLINE Notifyに送ってくれるようにしました。

# 必要なもの

* LINEアカウント
* Googleアカウント(GoogleカレンダーとGASを使います)


# LINE Notifyのトークンを取得する

以下のページからログインし、マイページへ移動してください。

https://notify-bot.line.me/ja/

<img width="1234" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/77a08f4e-7bad-3c68-c2b2-15d7f8285f92.png">

ページ下の方にある「トークンを発行する」ボタンをクリック。


<img width="1047" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/9a001c1d-2e40-5272-ccea-7705af390274.png">

すると、トークン発行画面が出てくるので、トークン名の入力と通知するトークルームを選択して「発行する」ボタンをクリック。

<img width="577" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/58e58000-0954-cb1e-e1b0-cb2ab23d4f6c.png">

トークンが発行されるので、コピーしてメモしておく。

<img width="574" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/3106a334-61fe-cc8b-558c-00cbf9d580d7.png">

# cRULコマンドで試してみる

トークンだけ変更して実行してみてください。

```sh
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" -F "message=ABC" https://notify-api.line.me/api/notify
```

以下の画像のような通知がくると思います。

<img width="343" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/a31dda5f-7c59-d7c3-0d6a-0e2c1ea6dba7.png">

# GoogleAppsScriptで毎日同じ時間に予定を通知する

## カレンダーIDを取得する

Googleカレンダーをブラウザで開きます。
左側のマイカレンダーから「設定と共有」を開きます。

![Google_カレンダー_-_2018年_7月.png](https://qiita-image-store.s3.amazonaws.com/0/195882/00259f01-7d08-75b3-1167-ac3bbcc849b7.png)


カレンダーIDをメモします。
メインアカウントだとおそらくただのメアドだと思います。


![Google_カレンダー_-_「Takeyuki_Imajo」のカレンダー設定.png](https://qiita-image-store.s3.amazonaws.com/0/195882/d59c6109-c52b-2f45-e7c3-dc716d7de864.png)

# GoogleAppsScriptで新規プロジェクト

GoogleAppsScriptで新規プロジェクトを作成し、以下のコードをコピペする。
(`calId`はカレンダーIDに、`key`はLINE Notifyで取得したトークンに変更する)

```js
function myFunction() {
  // カレンダーID
  var calId = "カレンダーID";
  // LINE Notifyのアクセストークン
  var key = "access token";
  
  var url = "https://notify-api.line.me/api/notify";
  

  var cal = CalendarApp.getCalendarById(calId);
  var now = new Date();
  var tomorrow = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1);
  // googleカレンダーより明日の予定を配列で取得。
  var tomorrowEvent = cal.getEventsForDay(tomorrow);
  
  // LINE Notifyに送るメッセージ
  var msg = "";
  // 予定がない時
  if(tomorrowEvent.length === 0){
    msg = "明日の予定はありません。";
  }
  // 予定がある時
  else{
    msg += "明日の予定は" + String(tomorrowEvent.length) + "件あります。\n\n";
    msg += allPlanToMsg(tomorrowEvent);
  }
  
  var jsonData = {
    message: msg
  }

  var options =
  {
    "method" : "post",
    "contentType" : "application/x-www-form-urlencoded",
    "payload" : jsonData,
    "headers": {"Authorization": "Bearer " + key}
  };

  var res = UrlFetchApp.fetch(url, options);
}

// イベントの配列をテキストにして返す
function allPlanToMsg(events/* array */){
  var msg = "";
  events.forEach( function(event, index){
    var title = event.getTitle();
    var start = event.getStartTime().getHours() + ":" + ("0" + event.getStartTime().getMinutes()).slice(-2);
    var end = event.getEndTime().getHours() + ":" + ("0" + event.getEndTime().getMinutes()).slice(-2);
    // 予定が終日の時
    if( event.isAllDayEvent() ){
      msg += String(index + 1) + "件目: " + title + " 終日の予定です。\n\n";
      return;
    }
    msg += String(index + 1) + "件目: " + title + " " + start + "~" + end + "\n\n";
  });
  return msg;
}
```

## テストしてみる

うまくLINE Notifyに送れるかテストしてみます。
画面左上の関数を`myFunction`を選択し、実行ボタンを押してみます。

![tester.png](https://qiita-image-store.s3.amazonaws.com/0/195882/b1c16bc7-0f52-2b17-739c-1193598f040a.png)

認証画面が出てくるので、認証を許可します。

![tester.png](https://qiita-image-store.s3.amazonaws.com/0/195882/e377be0a-42af-718d-1987-6e40c8e9c0df.png)

Googleアカウントのアクセスも許可します。

![ログイン_-_Google_アカウント.png](https://qiita-image-store.s3.amazonaws.com/0/195882/dcf9f4fb-21bb-ce9e-7af9-6a811195e439.png)

許可できたら、再度実行ボタンを押します。

以下のように通知がきたら成功です。

<img width="341" alt="LINE_Notify.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/a2f52892-8621-fbd3-e283-c54d1e133786.png">

## 毎に同じ時間に実行する

手動で実行していたら意味がないので、自動的に毎日同じ（くらい）の時間に実行されるように設定します。

画面左上の時計見たいなボタンをクリックします。

![tester.png](https://qiita-image-store.s3.amazonaws.com/0/195882/57199f0a-1cf1-e282-3129-0fe3c472a1d0.png)

トリガーの追加ボタンをクリック。

![tester.png](https://qiita-image-store.s3.amazonaws.com/0/195882/b9794873-e9d2-e066-3e73-ff76de26e0ec.png)

`myFunction`を選択肢、お好きな時間帯を選択し、保存します。

![tester.png](https://qiita-image-store.s3.amazonaws.com/0/195882/20614c72-e185-f9c2-e7e5-42e9664f9d4b.png)

おそらくこれで、毎日同じ時間に通知がくると思います。

# 参考

[[超簡単]LINE notify を使ってみる - Qiita](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)
[毎朝、当日の予定をGoogleカレンダーから取得してチャットワークに送る](https://tonari-it.com/gas-calendar/)