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」と設定しています。
以下のように通知が来たら成功です。
以上です。
改善点とかがあったら教えてください!
ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?