Googleカレンダーの予定をLINEに送る

サーバにupすることなく、Google Apps Scriptを使ってLINEに送る

作成日:2019-02-05, 更新日:2019-02-06

基本

・2019-02-05時点
・Google Apps Scriptが何かは分かっていない・・・調査する予定は今のトコ無し
・自分のGoogleカレンダーの予定を自分のLINEに送りたい・・・ただそれだけ
・参考サイト:Googleカレンダーの予定を毎朝LINEに通知する

仕様・要望

・面倒なコトはしたくない
・予定が無いときは「無い」ってコトが分かるようにLINEに送ってほしい

経緯

どうにかして、Googleカレンダーの予定をスマホに送りたかった。
スマホでGoogleカレンダーを開くのは面倒。PUSH通知でしてほしい。

・ひとまずPHP+ハングアウトで考える
→ハングアウトチャットというヤツが別にいて、コイツにアップグレードさせないといけないっぽいのであきらめる

・次にPHP+SMSで考える
→有料のSMSのAPIを使う or モデムか何かで敷居の高い設定をする・・・どちらもお手軽じゃないのであきらめる

・次にPHP+LINEで考える
→調べているPHP使わなくても簡単に出来るってコトでやってみる。

処理の流れ(2019-02-05時点)

1.LINE Notifyのトークン取得
2-1.Google Apps Script(Googleドライブ上にスクリプトファイル作成)
2-2.スクリプトファイルの修正、実行
2-3.cronの設定
3.その他

1.LINE Notifyのトークン取得

・PCからLINEにログインできるようにする(LINEのアプリ側の設定)
・「https://notify-bot.line.me/doc/ja/」からログインする
・「マイページ」に移動
・「トークンを発行する」から登録
※「サービスを登録する」は、企業名やURL、メアドの登録が必要。「トークンを発行する」は不要。

2-1.Google Apps Script(Googleドライブ上にスクリプトファイル作成)

・Googleドライブにアクセス
・「新規作成」で「Google Apps Script(「その他」の中。無ければ追加)」

▼コピペするソース

var lineToken = "〇〇〇〇";
var calName = "〇〇〇〇";
 
function main() {
  var calendars = CalendarApp.getAllCalendars();
 
  var tmpFrom = new Date();
  var fromAt = new Date(tmpFrom.getFullYear(), tmpFrom.getMonth(), tmpFrom.getDate(), 0, 0);
  var toAt = new Date(fromAt.getTime() + (((3600*24*2)-1)*1000));
  
  var headText = Utilities.formatDate(fromAt, 'JST', 'yyyy/MM/dd');
  headText += ' - ';
  headText += Utilities.formatDate(toAt, 'JST', 'dd') + "\n";
  
  var text = '';
  
  for(i in calendars) {
    var calendar = calendars[i];
    //var events = calendar.getEventsForDay(new Date());
    var events = calendar.getEvents(fromAt, toAt);
 
    if ( calendar.getName() != calName ){
      continue;
    }
    
    if( events.length > 0 ) {
      text += "◆" + calendar.getName() + "\n";
    }
    else {
      continue;
    }
 
    var tmpDay = '';
    for(j in events) {
      var event = events[j];
      
      if ( tmpDay != Utilities.formatDate(event.getStartTime(), 'JST', 'yyyy/MM/dd') ) {
        tmpDay = Utilities.formatDate(event.getStartTime(), 'JST', 'yyyy/MM/dd');
        text += "・" + tmpDay + "\n";
      }
      
      var title = event.getTitle();
      var start = toTime(event.getStartTime());
      var end = toTime(event.getEndTime());
      text += start + ' - ' + end + " " + title + '\n';
    }
 
    text += "\n";
  }
  
  if ( text == '' ){
    text += 'nothing' + "\n";
  }
   
  sendToLine(headText+text);
}
 
function sendToLine(text){
  var token = lineToken;
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + text,
     "headers" : {"Authorization" : "Bearer "+ token}
 
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
 
function toTime(str){
  return Utilities.formatDate(str, 'JST', 'HH:mm');
}

2-2.スクリプトファイルの修正、実行

・「var lineToken = "〇〇〇";」にLINEのトークンをコピペ
・「var calName = "〇〇〇〇";」を表示したいカレンダー名にする(※全部表示なら、関連するif文削除)
・欲しいのが「今日」ならコメントにしている「var events = calendar.getEventsForDay(new Date());」を使う。
・欲しいのが「今日と明日」以外なら「fromAt」「toAt」を修正
・保存して実行
※Googleカレンダーの認証をする必要あり

2-3.cronの設定

・「メニュー:編集」の「現在のプロジェクトのトリガー」をクリック
・ページ右下部あたりにある「トリガーを追加」をクリック

毎日1回で良いなら・・・

実行する関数 main
デプロイ Head
イベントのソース 時間主導型
時間ベースのトリガーのタイプ 日付ベースのタイマー
時刻 〇時~〇時
エラー通知 毎日通知を受け取る

3.その他

・PCからLINEにログインできないように戻す(LINEのアプリ側の設定)
※ログイン出来ても問題無い人は何もしなくて良い。

注意

Googleドライブで作成するときのアカウントのGoogleカレンダーの認証なら問題無し。

例えば、下記のようにドライブとカレンダーで異なるアカウントにすると後が面倒。
・Googleドライブのアカウント:hogeA@gmail.com
・Googleカレンダーのアカウント:hogeB@gmail.com