2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-20

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

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

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

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

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

##作成
###①LINE notifyの登録。
image.png

Line Notifyはこちらから

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

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

スライド4.JPG

ここ!

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

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

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

プレゼンテーション1.jpg

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

は?日付や時刻がわけわからん!
英語版じゃねーかww

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

そこで、色々格闘した…
スプレッドシートの表示形式を変えてみたり、出力形式を変えてみたり…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

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

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

スライド5.JPG

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

図1.png

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

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

2
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?