【GAS修行④】明日のスケジュール報告で忘れ癖解消BOTをLINE Notifyで作成

・GAS熟練者への道。
・先人達のコードの「写経＆コピー」の駆使の成果物のまとめ。
・第四弾
・[第一弾](https://qiita.com/t_o_d/items/a29b4ba6eacad77b3690)・[第二弾](https://qiita.com/t_o_d/items/7dcc5637ab06996c8eaa)・[第三弾](https://qiita.com/t_o_d/items/8763b7e84bafc83caa5c)はこちら。

## 経緯
・「四回目。」
・「まだまだ参考アプリがあるとは、オープン社会の素晴らしさは身に染みるほど体感。」
・「今回は、簡単だけど、すごく便利なものにしよう。」
→そういうわけで、今回もサンプルアプリと仏様サイトを発見。
https://qiita.com/imajoriri/items/e211547438967827661f
→「また参考（※マルコピ）に作るか。」
→取り組み開始。

## 概要
- 毎朝、Googleカレンダーの明日のスケジュールをLINEで教えてくれる。  
→忘却名人脱却。

## 結果
・実際の画面はこちらです。  
![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/336499/7ec7ad78-f6d7-57dc-52b6-9c3d90b5721e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/887d428b-a334-d3c0-802e-0184d6fd80a0.png)

## 作成環境
1. Google App Script
2. LINE Notify

## 手順（Google Apps Script、LINE Notifyの設定は[第一弾](https://qiita.com/t_o_d/items/a29b4ba6eacad77b3690)と一緒）
### Google Apps Scriptの設定
-  Googleドライブからスクリプトエディタを起動。  
※Googleアカウントを持っていない人は、作成する。
    - Googleドライブを起動
    - 「新規」→　「その他」→「アプリを追加」の順にクリック。  
    - アプリ検索欄に「script」と入力して検索。  
    - 検索結果に「Google Apps Script」が表示されるので、そこの「接続」ボタンをクリック
    - 改めて「新規」→ 「その他」の順にクリックしていくと、「Google Apps Script」が表示されているので、クリック。
- 起動したプロジェクトに名前をつける  
※プロジェクト名が反映されるわけではないが、自分がわかる名前をつける。  
→保存されたら一旦置いておく。

### LINE Notifyの設定
- LINE Notifyのトークンを発行。
    - [LINE Notify](https://notify-bot.line.me/ja/)にアクセスして、自分のLINEアカウント情報でログイン。
    - ログイン後、マイページを開く。
    - マイページ内の「トークンを発行する」ボタンをクリック  
    - 「トークン名」「通知先のトークルーム」を設定する。
    - 設定後、「発行する」ボタンをクリックして、トークンを発行。
    - 発行されたトークンをコピーして、控えておく。
- LINE Notifyを設定したトークルームに招待する。

### Googleカレンダーの設定
- GoogleカレンダーIDを取得。
    - [Googleカレンダー](https://calendar.google.com/calendar/r)にアクセス。  
    ※使用していない人は、動作確認のため、明日のスケジュールだけでも入れましょう。
    - Googleカレンダーページ内の左側のマイカレンダーメニューの「点３つ」から「設定と共有」をクリック
    ![tempsnip.png](https://qiita-image-store.s3.amazonaws.com/0/336499/14bd1206-137a-c76a-0a6f-2f0776b583c4.png)
    - カレンダー設定ページに遷移後、ページ下部にある「カレンダーの統合」欄の「カレンダーID」をメモしておく。  
    ※大体、カレンダーIDは自分のメールアドレスとなっている。
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/322616b0-f84f-9282-d590-0cb42874698e.png)

### コード
- 先程のスクリプトエディタに戻り、下記のコードをコピーして、保存。

```JavaScript:line-tommorow-calendar.gs
function myFunction() {
  // カレンダーID
  var calId = "GoogleカレンダーIDを書く。";
  // LINE Notifyのアクセストークン
  var key = "LINE Notifyのアクセストークンを書く。";

  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 = Utilities.formatDate(tomorrow,"JST","yyyy/MM/dd") + "は、、、\nなんと予定はありません。\nやったー（*^▽^*）（*^▽^*）";
  }
  // 予定がある時
  else{
    msg += "\n" + Utilities.formatDate(tomorrow,"JST","yyyy/MM/dd") + "はね、、、\n「" + String(tomorrowEvent.length) + "」件の予定があるよ。\n頑張ってね（*^^*）\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";
  });
  return msg;
}
```
 ※以下の項目を自分のものに変えるのを忘れない。
　　　・GoogleカレンダーID（先程メモしたもの。）
　　　・LINE Notifyのアクセストークン（先程メモしたもの。）

- 自分のコードに書き換えて保存後、「myFunction」関数を実行して、通知確認。
    - スクリプトエディタ内の上部メニューの「関数名」の部分を「myFunction」に変更して、二つ左の「▶」ボタンで実行。
- 通知確認後、指定の時間にコードを実行してもらうために、トリガーを設定。
    - スクリプトエディタのタブメニューの「編集」→ 「現在のプロジェクトのトリガー」をクリック。
    - トリガーを作成して、下記の画像のように設定。（※時間は自由に設定。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/45cff33f-8f9d-f8d8-b115-6e0f3b99a926.png)

    - 保存。
- 完了。

## まとめ
・過去のものよりは、比較的簡単だが、それに伴う効果は非常に高いと実感。
・これで、忘却名人脱却で、仕事名人へもだいぶ近づいたのではないかと、うぬぼれ。
・これを見てくださるエンジニアの皆様、「俺はこういう実装をして、更に格が違う仕事人間だぞ」「お前もひよっこだな」という意見等あれば、是非教えていただけると幸いです。

## 参考
- https://qiita.com/imajoriri/items/e211547438967827661f  
→ほぼこのサイトで完結。大変お世話になりました。
- https://blog.apibank.jp/use_how-api/  
→APIの仕組みがまとめられている。