見出し画像

GoogleカレンダーからLINEに通知を送る方法


はじめに

こんにちは。 SHIFTアジャイルサービスグループの中野です。

今回はタイトルの通り、Googleカレンダーの予定を自動で取得してLINEに通知を送るやり方をご紹介します!

背景としては子供のテスト期間までの日数や一大イベントまでの残り日数を
カレンダーから数えるのが非常に面倒・・・。
自動で計算して出してほしい・・・!
という日常における課題がありました。

そこで今回は、そんな悩みを自動化により解決するために
「通知先は家族で使っているLINEグループに送れると尚よいな~」
などと思いながら作業に取り掛かりました。
そうです、メンドウなものは全部自動化したい。
ということで、似たようなお悩みを持つ方のご参考になれば幸いです!

Step1:要件の明確化

  • Googleカレンダーの予定からLINEに通知を定期処理で送りたい

  • 子供のテスト期間までの日数や一大イベントまでの残り日数を数えたい

  • 通知先は家族でLINEグループを作成していたのでそこに送る様にしたい

  • メンドウなものは全部自動化したい

Step2:実現方法の調査

  • Google Apps ScriptでScriptを書いてLINE Notifyを利用してLINEに通知を送る。

  • Googleカレンダーから情報を読み取るのに都合がよいのは何かなーといつものGoogle先生と対話してGoogle Apps Scriptで実現するのが良いかも!と助言を頂きました。(類似の要件でブログを書いているモノを発見!)

Step3:開発の事前準備

  • Google Apps Script、Googleカレンダーを利用するため、Googleアカウントを取得

  • LINEのトークンをLINE Notifyで発行

  • Googleカレンダーのカレンダー設定メニューのカレンダーIDを取得(今回はアカウント内の特定のカレンダーを対象に実行したかったため取得)

Step4:Google Apps Scriptの開発

  • Google DriveでGoogle Apps Scriptのファイルを新規作成

  • Google Apps Scriptのプロジェクトの設定メニューの下部にあるスクリプト プロパティにLINE Notifyで発行したトークン値を入力

  • LINEへの通知を定義する

  • カレンダーのイベントを取得する処理を定義する

  • カウントダウン処理を定義する

  • 指定のマークの無い場合のスキップ処理を定義する

  • LINEに送信する文字列を変数含め定義する

  • 編集した文字列をLINEにSendする

以下サンプルコード

// 設定
var COUNT_DATE = 265; // 向こう30日の予定に関してカウントする
var IMP_MARK = "★"; // 重要なイベントを表す記号
var MAIL_TITLE = "[カウントダウン]"; // メールのタイトル

//LINEに通知
function SendToLine(message){
  //ファイル→プロジェクトのプロパティ→スプリクトのプロパティからLINE_TOKENを設定しておく
  var token = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN');
  var op =
    {
      "method" : "post",
      "Content-Type" : "application/x-www-form-urlencoded",
      "payload": "message=" + message,
      "headers":{"Authorization" : "Bearer " + token}
    };
  var res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
  Logger.log(JSON.parse(res.getContentText())); //Response
}

function CalendarCountDate() {
  var DAY_MSEC = 1000 * 60 * 60 * 24;
  // カレンダーを得る
  var cal = CalendarApp.getCalendarById("XXXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com");
  // 指定日以内のイベントを得る
  var today = new Date();
  var endDate = new Date(today.getTime() + DAY_MSEC * COUNT_DATE);
  var events = cal.getEvents(today, endDate);
  // 各イベントをカウントダウンする
  var res = "";
  for (var i in events) {
    var event = events[i];
    var start_d = event.getStartTime();
    var diff_msec = start_d.getTime() - today.getTime();
    var diff_date = Math.ceil(diff_msec / DAY_MSEC);
    var title = event.getTitle();
    // 重要マークのないイベントはスキップする
    if (title.indexOf(IMP_MARK) < 0) continue;
    var td = "";
    var message = "";
    if (diff_date <= 0) {
      td += "[今日]";
    } else {
      td += "[" + diff_date + "日後(" + 
        (1 + start_d.getMonth()) + "/" + start_d.getDate() + ")]";
    }
    td += " " + title;
    res += td + "\n";
    message += "\n◆◇予定の一覧◇◆\n"+res; 
  }
    SendToLine(message);
}

LINE通知処理.txt

※上記コードをtext化したモノ

Step5:自動実行の設定

  • Google Apps Scriptのトリガーメニューからトリガーの追加

  • 各種実行したいタイミングを設定

Step6:稼働確認

  • 日時で夜8-9時の間に実行される※今回は左記時刻でセット

おわりに

無事LINEに通知を送ることが出来るようになりました!
これで「○○まで後何日?」と確認する必要が無くなる!
ただ、子供には大変不評です・・・何故・・・(もう少し大人になればきっとわかってくれるはず!)


執筆者プロフィール:中野
◯ ニックネーム:よっしー
◯ SHIFT入社:2020年1月
〇郵政民営化頃からIT業界で働き始め、PG・SE・PL・PM・コンサル・・・等々、本当に色々な事に従事させて頂きながら業界の隅っこで暮らしています。 プログラムで楽をしたいという邪な思いからスクラッチ開発を自宅でも行う様になって早数年。24時間稼働する様なプログラムが組めた時にはやってよかったー!という達成感もあり、日々ちょっとしたモノを自動化していっています。

お問合せはお気軽に

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら