PIYO - Tech & Life -

Googleカレンダーの予定を毎朝LINEに通知する

小ネタです。カレンダーアプリを見ればいいだけの話なんですが、どうも見忘れてしまうのでLINEに通知しようと思い立ち実施したよという話です。

IFTTTがいけるかもしれないなと思って調べましたが、Googleカレンダー関係では新規予定の登録や予定開始の15分前になったらといったトリガーしかなく、自分が参照しているカレンダーの予定を一括で取ってきてどうこうみたいなことは難しそう。

なのでGoogleAppsScriptを使ってみることにしました。似たようなことをチャットワーク宛に実現している方がいたのでそちらを参考にしつつ、元のコードが1つのカレンダーにしか対応していなかったのを全カレンダーを対象にしたり、LINE Notifyに対応したりといった改修を行っています。

LINE Notifyのトークン取得

LINE NotifyはLINEにメッセージを通知するため仕組みです。LINE Notify APIにトークンとメッセージを送るとトークンが紐づけられたグループにメッセージが届きます。

本来はウェブサービスなどからOAuthで認証して使うサービスなのですが、開発者向けにパーソナルトークンを発行できるようになっているので、今回のような用途ではパーソナルトークンを使うほうがいいでしょう。

LINE Notify
LINE Notify allows you to send web notifications from GitHub, IFTTT, Mackerel, and more directly to your LINE chats.

このサイトの右上リンクからLINEのIDログインして、画面下にある「トークンを発行する」から進みます。今回の連携に名前を付け、適当送信先のグループを選べばトークンが発行されますのでそれを控えておきます。

送信先グループはLINE Notifyとの1:1のチャットか、グループを選べます。グループを選んだ場合はLINE Notifyアカウントをそのグループに追加しておかなければなりません。

僕の場合は、「今日の予定」という自分(+ LINE Notify)だけのグループを作り、そこに送るよう設定しました。

(※初めて登録したときの流れを忘れてしまっています。もしかしたらログイン以外にも何かしなければいけなかったかもしれません)

Google Apps Script

Googleドライブの適当な場所にスクリプトを置きます。右クリックして「Google Apps Script」を選びます。見当たらない場合は一番下の「アプリを追加」からGoogle Apps Scriptを追加したあと同じ操作をします。

スクリーンショット 2017-03-15 13.17.36.png

エディタが出るのでこのコードをパッと貼ります。一番上の行にはLINE Notifyで取得したトークンを入れます。

var lineToken = "YOUR-LINE-TOKEN";

function main() {
  var calendars = CalendarApp.getAllCalendars();
  var text = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + "\n";

  for(i in calendars) {
    var calendar = calendars[i];
    var events = calendar.getEventsForDay(new Date());

    if( events.length > 0 ) {
      text += "◆ " + calendar.getName() + "\n";
    }

    for(j in events) {
      var event = events[j];
      var title = event.getTitle();
      var start = toTime(event.getStartTime());
      var end = toTime(event.getEndTime());
      text += start + ' - ' + end + " " + title + '\n';
    }

    if( events.length > 0 ) {
      text += "\n";
    }
  }

  sendToLine(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');
}

メニューの「実行」からmainを選ぶとスクリプトが実行されますが、一番最初の起動時はカレンダーの認証が入ります。一旦許可したあとは認証されたものとして、そのアカウントが参照しているカレンダー全てから予定を集めてLINEにメッセージを飛ばしてくれるはずです。

あとは毎朝自動でこのスクリプトが走るようにすれば良いですね。メニュー下にあるツールバーの時計のようなアイコンからトリガーを追加し、希望の時間に設定すればOKです。

参考