見出し画像

Googleカレンダーの1週間分の予定をLINEで通知するプログラムを作ってみました

Googleカレンダーの予定を前日の夜に通知して欲しかったけど、Googleカレンダーの設定ではできないので、自分で作ってみました。

こんな感じでLINEに通知されます。
(終日の予定は00:00-00:00となります。)

仕様としては、
・使用言語はGAS(Google Apps Script)
・Googleカレンダーの予定を取得して、LINEに通知
・翌日から任意の日数分の予定を通知可能
・複数のカレンダーの予定を通知可能

参考にしたのは以下のサイト。

LINE Notifyとの連携

以下のサイトに
ログイン(LINEに登録してあるメールアドレスとパスワードを使う)
→マイページ
→「トークンを発行する」
と進み、パーソナルアクセストークンを取得します。

トークンはメモ帳とかにちゃんとコピペしておいてください。

Google Apps Script(GAS)

次にGoogle Driveを開いて、
新規
→その他
→Google Apps Script
と進んでプロジェクトを作成します。

エディタが出てくるので、以下のコードを入力します。
先ほど取得したLINE NotifyのトークンとGoogleカレンダーのIDも入れてください。

function main(){
  
  var startDate = new Date();
  var period = 7; // 予定を表示したい日数

  startDate.setDate(startDate.getDate() + 1);
  var schedule = getSchedule(startDate, period);
  var message = scheduleToMessage(schedule, startDate, period);

  sendToLINE(message);  
}

// Googleカレンダーから予定を取得
function getSchedule(startDate, period){
  var calendarIDs = [ID1, ID2, ・・・]; //取得したいカレンダーのIDの配列
  
  var schedule = new Array(calendarIDs.length);
  for(var i=0; i<schedule.length; i++){schedule[i] = new Array(period);} //二次元配列の作成
  
  for(var iCalendar=0; iCalendar < calendarIDs.length; iCalendar++){
    var calendar = CalendarApp.getCalendarById(calendarIDs[iCalendar]);
    
    var date = new Date(startDate);
    for(var iDate=0; iDate < period; iDate++){
      schedule[iCalendar][iDate] = getDayEvents(calendar, date);
      date.setDate(date.getDate() + 1);
    }
  }
  
  return schedule;
}  

function getDayEvents(calendar, date){
  var dayEvents = "";
  var events = calendar.getEventsForDay(date);
  
  for(var iEvent = 0; iEvent < events.length; iEvent++){
    var event = events[iEvent];
    var title = event.getTitle();
    var startTime = _HHmm(event.getStartTime());
    var endTime = _HHmm(event.getEndTime());
    
    dayEvents = dayEvents + '・' + startTime + '-' + endTime + ' ' + title + '\n';
  }

  return dayEvents;
}

function scheduleToMessage(schedule, startDate, period){
  var now = new Date();
  var body = '予定リスト\n' 
    + '(' +_Md(now) + ' ' +_HHmm(now) + '時点)\n'
    + '----------\n';
  
  var date = new Date(startDate);
  for(var iDay=0; iDay < period; iDay++){
    body = body + _Md(date) + '(' + _JPdayOfWeek(date) + ')\n';
    
    for(var iCalendar=0; iCalendar < schedule.length; iCalendar++){
      body = body + schedule[iCalendar][iDay];
    }   
    
    date.setDate(date.getDate() + 1);
    body = body + '\n';
  }

  return body;
}

// LINEにメッセージを送る
function sendToLINE(message){
  var token = 'token'; //LINE Notifyのトークン
  var options =
      {
        "method": "post",
        "payload": "message=" + message,
        "headers": {"Authorization" : "Bearer "+ token}
      };

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
  
}

// 日付のフォーマット関数
function _HHmm(date){
  return Utilities.formatDate(date, 'JST', 'HH:mm');
}

function _Md(date){
  return Utilities.formatDate(date, 'JST', 'M/d');
}

function _JPdayOfWeek(date){
  // date = new Date()
  var dayStr = ['日', '月', '火', '水', '木', '金', '土'];
  var dayOfWeek = date.getDay();
  
  return dayStr[dayOfWeek];
}

(もっと良い書き方があったら教えてください。)

プロジェクトの認証とトリガーの設定

メニューから
「実行」→「関数を実行」→「main」
を選んでこのプログラムを実行します。

すると最初は「認証が必要です」と表示されるので、許可してください。
一度許可すればOKです。

LINEに正しく通知されたら、
「編集」→「現在のプロジェクトのトリガー」
からトリガーを設定してください。
僕は「毎日、21:00~22:00」と設定しています。

以下のように通知が来たら成功です。

以上です。
改善点とかがあったら教えてください!
ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?