やりたいこと。
当日朝、家族に晩御飯が不要な時だけ自動的に通知。
基本的には何も通知しない。
上記の実装をしたのがJSもまとめに読めなかった時なので、
コードの意味を照らし合わせた時のメモ書きも一緒に晒します。
家族のGoogleカレンダーの予定をLINEに通知する
を参考にしました。ありがとうございます。
利用ツール
普段のスケジュールはlifebear
で管理
晩御飯が不要になるイベントのみ、同期済みのGoogleアカウントに連携させる。
実装したコード
var lineToken = "sample"; // TODO: ここに発行したアクセストークンを記載
// 個人アカウント(gmailアドレス)とカレンダーの名称を対応付
var calendarTitleMap = {
"piyo@gmail.com": "piyo",
};
// main関数を実行すれば全てが動く。
function main() {
var calendars = CalendarApp.getAllCalendars();
var eventDate = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd') + "\n";
// 拡張for文
for (i in calendars) {
var calendar = calendars[i];
// 指定した時刻を表す日付オブジェクトを生成。
//何も指定されなかった場合は現在の(デバイスに)設定されている時刻を取得する。
var events = calendar.getEventsForDay(new Date());
// イベントがある場合のみ実行。
if (events.length > 0) {
//*1 ここのコメントが、LINE通知に出力される。
eventDate += "\n" + "今晩、晩御飯不要です(● ˃̶͈̀ロ˂̶͈́)੭ꠥ⁾⁾" + "\n";
}
for (j in events) {
var event = events[j];
var title = "\n" + event.getTitle();
var start = toTime(event.getStartTime());
var end = toTime(event.getEndTime());
//*2 ここの記載方法でイベント名と時間が、LINEに通知される。
eventDate += start + ' - ' + end + " " + title + '\n';
}
// イベントがある場合のみLINE通知の関数を実行。
if (events.length > 0) {
eventDate += "\n";
sendToLine(eventDate);
}
}
}
function sendToLine(eventDate) {
var token = lineToken;
var options = {
"method": "post",
"payload": "message=" + eventDate,
"headers": {
"Authorization": "Bearer " + token
}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
function toTime(str) {
return Utilities.formatDate(str, 'JST', 'HH:mm');
}
LINEにはイベントがあった場合、下記の形で出力
[〇〇の予定Bot] 2019/08/01
*1 今晩、晩御飯不要です(● ˃̶͈̀ロ˂̶͈́)੭ꠥ
*2 19:00 - 21:00
友人とご飯。(登録したイベント名)
constとかに変えると不具合出るので、varのままで。
JSっぽいけど、JSじゃないんだなあ。
参考
『家族のGoogleカレンダーの予定をLINEに通知する』
https://qiita.com/monoqlock/items/55bf4860003ab1405a7f
『Google Apps Scriptを使い、Googleカレンダーの予定の中で、特定の文字列が含まれる“当日の終日イベント予定”のみをメール通知する方法』
https://techbitingbug.com/gas-morning-events/