Googleカレンダーに登録されている予定を前日の夜にリマインドしてくれるラインBot作成してみた！

##グーグルカレンダーの明日の予定を知らせてくれるLINEを作成してみた

だいたい三時間ほどで完成した。
一カ所詰まったところあるので、そこがなければもっと早かったはず…

##機能の紹介
Googleカレンダーに登録してある予定を前日の夜LINEでお知らせしてくれるLINE Notify。

##開発の経緯
日頃、予定の管理をGoogleカレンダーでしているが、困ったことに、見忘れる、そもそも見るのが面倒に思えてきた…
ただ、予定をすっぽかすと先方に失礼なので、なんとしても避けないといけない…

そこで、毎晩明日の予定をお知らせしてくれるLINE botを実装すれば、よいのではと思い開発した。
厳密にいうと、Line bot ではなく、LINE Notifyでした。

##作成
###①LINE notifyの登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/b9fa878b-fffa-501b-b5d3-0c45a8cf819d.png)

[Line Notifyはこちらから](https://notify-bot.line.me/ja/)


ログインしたら、マイページからどこにお知らせするのか(開発者本人のLINEかグループか)を選択する。
トークンが発行されるので、これをメモメモ。

###②GASのスクリプトの作成
つぎに、Google app scriptのスクリプトを書く作業。
スプレッドシートのメニュー＞ツール＞スクリプト<>へいく

![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/4adc9730-f6bd-f12a-2df2-db328910baf6.jpeg)

ここ！


さて、今回実装する機能は２つ

 - [a] Googleカレンダーから明日の予定をスプレッドシートに出力
 - [b] スプレッドシートに出力された内容をLINEで配信

さっそく、[a]の機能から実装していく。
Googleカレンダーの内容をスプレッドシートに出力するには、カレンダーの設定からカレンダーIDを確認する。

![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/d631ea85-f979-ffe4-75cb-dc965a246d27.jpeg)

```
function calendar() {

//1　スプレッドシートを読み込む
  var sp =SpreadsheetApp.getActiveSheet(); 

//2　カレンダーをIDで読み込む
  var cal=CalendarApp.getCalendarById( '*自分のカレンダーID*' ); 

//3　カレンダーのイベントの期間を指定
  var date = new Date();
  var today = new Date(date.getFullYear(),date.getMonth(),date.getDate()+1,0,0);　　　
  var endday = new Date(date.getFullYear(),date.getMonth(),date.getDate() + 1,23,59);
  var event　=　cal.getEvents(today,endday); 
  
  sp.clear();

//4　イベントをスプレッドシートへ書き出す
  for(var i=1;i<event.length+1; i++){
    sp.getRange('a'+i).setValue(event[i-1].getTitle()); 　　　　　　　　　//イベントタイトル
    sp.getRange('b'+i).setValue(event[i-1].getStartTime());  　　　　　　//イベント開始時刻　　
    sp.getRange('c'+i).setValue(event[i-1].getEndTime()); 　　　　　　　　//イベント終了時刻
  }

};

```


次に②の実装。
こちらは、特に問題ない…はずだった…

```
function postContent() {
  var sheet =SpreadsheetApp.getActiveSheet(); 
  var LastRow = sheet.getLastRow();
  var content = "\nこんばんにゃ\n定時なので明日の予定をお知らせするぞ～\n\n";
  
  if (LastRow === 0) {
      content +="明日の予定はなし\n有意義に過ごせ！\n\n"
    }
    else {
       
  for (var n=1;n<=LastRow;n++){
  var title=sheet.getRange(n, 1).getValue();
  var start=sheet.getRange(n, 2).getValue();
  var end=sheet.getRange(n, 3).getValue();
  var schedule = title + ": \n"+start+"から"+end+"まで\n\n";
  content +=schedule  
  }
    }
 
  content += "\n以上";
  sendPostContent(content);
}

function sendPostContent(content) {
  var token = ['*Line Notifyのアクセストークン*'];
  var options = {
    "method": "post",
    "payload" : {"message": content },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}


```

これで、ラインに配信した結果！

![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/2137baeb-5601-4c9b-4ebe-9d6a9e3bcc21.jpeg)

は？日付や時刻がわけわからん！
英語版じゃねーかｗｗ

当たり前だけど、これを日本語版に変えたい！

そこで、色々格闘した…
スプレッドシートの表示形式を変えてみたり、出力形式を変えてみたり…etc

結局、LINEにおくる本文の方の表示形式を変えればオールオッケーだった！
Utilities.formatDate()っていう関数がどうやらあるらしいという情報を得たので、さっそく実装！

```
var jst_start = Utilities.formatDate(start,"JST","yyyy年M月d日 H時m分");
var jst_end = Utilities.formatDate(end,"JST","yyyy年M月d日 H時m分");
```
こんな感じ。


結局こーなったよってのが、以下のやーつ。

```
function postContent() {
  var sheet =SpreadsheetApp.getActiveSheet(); 
  var LastRow = sheet.getLastRow();
  var content = "\nこんばんにゃ\n定時なので明日の予定をお知らせするぞ～\n\n";
  
  if (LastRow === 0) {
      content +="明日の予定はなし\n有意義に過ごせ！\n\n"
    }
    else {
       
  for (var n=1;n<=LastRow;n++){
  var title=sheet.getRange(n, 1).getValue();
  var start=sheet.getRange(n, 2).getValue();
  var end=sheet.getRange(n, 3).getValue();
  var jst_start = Utilities.formatDate(start,"JST","yyyy年M月d日 H時m分");
  var jst_end = Utilities.formatDate(end,"JST","yyyy年M月d日 H時m分");
  
  var schedule = title + ": \n"+jst_start+"から"+jst_end+"まで\n\n";
  content +=schedule  
  }
    }
 
  content += "\n以上";
  sendPostContent(content);
}

function sendPostContent(content) {
  var token = ['*Line Notifyのアクセストークン*'];
  var options = {
    "method": "post",
    "payload" : {"message": content },
    "headers": {"Authorization": "Bearer " + token}    
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}


```

![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/c16d6b46-b568-26f0-415d-f4b5b2036f0e.jpeg)

これで日本語になった！！

最後に今まで書いた2つの関数をそれぞれ定時実行するように設定しておしまい！

![スライド5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/08771394-33fb-2e88-aa7c-98c3a2bd575a.jpeg)

この時計みたいな奴を押して、
トリガーを追加から、関数を指定して
（今回ならcalender　と postContent）

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453622/7b6936f9-21d4-cabe-cdd1-c650518076c8.png)

こんな感じにすればOK！
calenderを先に定時実行するように気をつけて！！


以上、Googleカレンダーの予定を前日の夜にリマインドしてくれるLINE Notifyの実装でした！
フィードバックお待ちしてます！