LINE Notifyで自分のカレンダーから自動でリマインダーを流す

# 概要

毎週日曜日の夜に、Google Calendarの予定を自動で読み込み、自分のLINEにポストする。
やることは三つ。
    1. LINE Notifyにアクセス、マイトークンの発行
    2. Google Calendarでマイカレンダーを設定
    3. Google Apps Scriptでリマインダーを実装

# 1. LINE Notifyを設定

### LINE Notifyとは
LINEが提供している無料のサービス。様々なアプリやWebサービスとAPI連携し、受け取った通知をLINEのグループに送信することができる。

### LINE Notifyの登録
 1. LINEでメンバーが自分だけのグループを適当に作成
グループ名を「リマインダー」とか、分かりやすいようにしておくといいかも。  
![10137_with_border.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/a553d54c-206a-92ee-4c13-9ea26930aa81.jpeg)

 2. 以下にアクセスし、自分のLINEに登録しているメールアドレスとパスワードでログイン
[LINENotify](https://notify-bot.line.me/ja/)

 3. 右上のメニューからマイページを選択
![スクリーンショット 2020-02-02 19.40.25_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/758e5fd9-9d71-18b9-b829-eef6d4bb24a4.png)

 4. アクセストークンの発行 からトークンを発行
![スクリーンショット 2020-02-02 19.25.58_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/c3dd21be-0047-8c5b-927b-db1400be7cab.png)

    (1) <b>トークン名</b>は適当に「来週の予定」などに設定。  
このトークン名は、最終的にリマインダーをメッセージとして送信する際に、メッセージの頭につく。例えば「来週の予定」というトークン名にすると以下のようにLINEにメッセージがくる。  
![10139_with_border.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/cb084134-0ca3-df2a-e22f-f9edab7dc855.jpeg)

    (2) <b>通知するトークルーム</b>には、先ほど作ったグループを選択
![スクリーンショット 2020-02-02 21.16.18 1_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/c887104e-ec9d-ebb3-9509-e93b3dc254ee.png)

 5. トークンIDをメモっておく。
![スクリーンショット 2020-02-02 21.16.27_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/4e7be170-b507-1824-ee92-c1ef036e8a8d.png)

 6. LINE Notify側は設定完了
![スクリーンショット 2020-02-02 21.17.01_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/209b5e64-d53f-f1d1-e628-41b2aa6f94f7.png)

 7. スマホでLINEを開いて、選択したグループに「LINE Notify」を招待しておく。これでLINEの設定は完了
 ![10148_with_border.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/a990a717-5e26-0a00-a870-c14417fef6bf.jpeg)

# 2. Google Calendarでマイカレンダーを設定

### マイカレンダーとは
言うまでもないが、Google Calendarにある機能の一つ。自分のカレンダーに登録する予定をグループ化して管理できる。"仕事"とか"プライベート"みたいな感じで作っておくと便利なやつ。
今回はリマインダー用のグループとして「いろんな予定」を作成する。  

### マイカレンダーの登録
 1. 自分のGoogle Calendarを開き、左側にある「他のカレンダー」の"+"ボタンから新しいカレンダーを作成する。  
 ![スクリーンショット 2020-02-02 21.41.18_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/62e92550-0af4-e746-6e67-f96b69cb7290.png)

 2. 適当に名前をつけて作成
 ![スクリーンショット 2020-02-02 21.36.15_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/27b2b034-2a2a-e18f-f53a-33ff13f58ac6.png)
![スクリーンショット 2020-02-02 21.36.43_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/73ff1a8c-226e-b344-8144-5364f7d3c1f1.png)

 3. カレンダーIDの取得
    1. 作成した「いろんな予定」のところにカーソルを合わせると出てくる、縦の三つコロンから「設定と共有」を開く。
    2. バーっと下に進むと、「カレンダーの統合」とあるので、そこに書いてある「カレンダーID」をメモする。

![スクリーンショット 2020-02-02 21.37.27_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/95b624e1-5ab7-1aa1-4891-6a12ca1e85ba.png)

 4. マイカレンダーの設定完了

# 3. Google Apps Scriptで実装
### Google Apps Scriptとは
Googleが提供しているサービスの一つ。サーバーサイドのスクリプト環境。要するに、Googleのサーバー上でプログラムを実装し、そこで走らせることができる。GASとか言われてる。下記リンクからChromeに追加できる。
[Google Apps Script](https://chrome.google.com/webstore/detail/google-apps-script/eoieeedlomnegifmaghhjnghhmcldobl?hl=ja)
![スクリーンショット 2020-02-02 22.18.02_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/b1e92c78-8ec2-0e04-7b13-c7382fb4611e.png)

### Google Apps Scriptで実装

<ol>
<li>「新しいプロジェクト」から、新規プロジェクトを作成
 ![スクリーンショット 2020-02-02 22.30.03_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/457f0e6f-9bdd-9108-e570-62b0d63e5d9a.png)

</li><li>カレンダーを読み込み、メッセージとして通知するためのプログラムを実装
`lineTokenID`の所に先ほどメモしたLINE NotifyのトークンIDを、`googleCalendarID`の所にはマイカレンダーのIDを入れる。
 
```gs:reminder.gs
var lineTokenID = 'memositeoitalinetokenid';
var googleCalendarID = 'googlecalendarid@group.calendar.google.com';

function sendToLine(text) {
  var text = 'test'
  
  var token = lineTokenID;
  var options =
   {
     'method'  : 'post',
     'payload' : 'message=' + text,
     'headers' : {'Authorization' : 'Bearer '+ token}
   };
   UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
}
```

</li><li>試しに実行
蜘蛛のアイコンの隣の実行ボタンから、実行できる。
![スクリーンショット 2020-02-02 22.40.13_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/bee29627-9a64-3027-ffcf-c47a19cd2dc8.png)

最初の実行時には以下のような警告が出る。
![スクリーンショット 2020-02-02 22.41.00_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/8118e0a4-b3b8-db5f-087f-4844175e9a0e.png)

「許可を確認」→「詳細」→「〇〇に移動」→「許可」で承認する。
![スクリーンショット 2020-02-02 22.43.53_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/632b1f53-06a7-c6eb-258b-2ee6cbd09759.png)
![スクリーンショット 2020-02-02 22.44.02_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/074d39da-3e5d-5276-2121-a93de854822d.png)

</li><li>無事通知されることを確認
![10151_with_border.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/d318efb0-a09c-3ec4-38c3-ab3a512e796d.jpeg)

</li><li>日曜日に次の一週間の予定を読み込み通知するプログラムを実装
関数`notify()`のところで、先一週間の予定を読み込み、通知を投げます。

```gs:reminder.gs
var lineTokenID = 'memositeoitalinetokenid';
var googleCalendarID = 'googlecalendarid@group.calendar.google.com';
var weekday = ['月', '火', '水', '木', '金', '土', '日'];

function toTime(str) { return Utilities.formatDate(str, 'JST', 'HH:mm'); }
function toDay(str) { return Utilities.formatDate(str, 'JST', 'd'); }
function sendToLine(text) {
  var token = lineTokenID;
  var options =
   {
     'method'  : 'post',
     'payload' : 'message=' + text,
     'headers' : {'Authorization' : 'Bearer '+ token}
   };
   UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
}

function notify() {
  var text = '\n';
  var sunday = new Date();
  var calendar = CalendarApp.getCalendarById(googleCalendarID);
  
  // 先一週間の予定を読み込み
  for (var d = 0; d < weekday.length; d++) {
    var day = new Date();
    day.setDate(sunday.getDate() + (d+1));
    var events = calendar.getEventsForDay(day);
    
    if (events.length > 0) {
      text += '\n'+toDay(day)+'('+weekday[d]+')'
      for (var e = 0; e < events.length; e++) {
        var event = events[e];
        var title = event.getTitle();
        var start = toTime(event.getStartTime());
        text += '\n・' + title;
      }
    }
  }
  
  // LINEに送信
  sendToLine(text);
}
```

試しに火曜と金曜に適当な予定を入れて、`notify()`関数を実行するとこんな感じ。
![10153_with_border.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/4748e38d-731e-9c26-b42c-98cee6534143.jpeg)


<li></li>毎週日曜の夕方に上のプログラムを実行するように設定
 1. Google Apps Scriptのプロジェクト一覧を開き、今回作成したプロジェクトの右端にある縦コロン三つのアイコンから「トリガー」をクリック。
![スクリーンショット 2020-02-02 23.11.01_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/c4f8dfd2-c3a8-9c95-6c66-3142f528ddb9.png)
 2. トリガーを追加し、諸々を設定
 ![スクリーンショット 2020-02-02 23.15.26_with_border.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526341/cda9f1e6-197c-4285-fbbd-f375995e02eb.png)
 3. 保存を押して終了

</li><li>Google Apps Scriptの設定完了
</li>