不均衡による技術発展 ~20世紀の席巻と21世紀の失速~
前回、Google Apps Scriptを使って、SpreadSheetからGoogleカレンダーに予定が書きこめるようになりました。
次は、Googleカレンダーに書き込んだ予定を、前の日の夕方に自分宛てにメール送信するリマインダーを作ってみましょう。
GASを使えばカレンダーから予定を読み込めますし、Gメールを送信することもできます。
まず、予定を読み込むカレンダーを取得して、変数calendarに格納します。
let calendar = CalendarApp.getCalendarById(id);
"id" は「カレンダーの設定」の「カレンダーID」に表示される"xxx@xxx.xxx"のことですね。
そしてそのカレンダーから予定を取得して、変数eventsに格納します。
let events = calender.getEventsForDay(date);
この"date"に明日の日付をセットしておきます。
let date = new Date();
date.setDate(date.getDate() + 1);
明日の予定が複数あった場合は、events[0]から順番に格納されます。
let event;
for(var i=0; i < events.length; i++){
event = events[i];
}
で、"event"に格納しながら順番に取り出すことができます。
次は、この"events"からメールに書きたい項目を抜き出して、文面を作ります。
何も予定がないときは、 「予定はありません」と書くことにします。
これをするために、"events"の中身があるかどうかを判別して、分岐させましょう。
if(events.length > 0){ //予定が何かある場合
//メールの文面作成
}
else {
//「予定はありません」
}
メールの文面としては、「10時00分 ~ 12時00分 : あの件」のようにします。
時間は読みやすい形式に変換しましょう。
"mailContents"に文面を格納することにして、
let mailContents = "";
開始時間を、
mailContents += Utilities.formatDate(event.getStartTime(),"GMT+0900","HH時mm分") + " ~ ";
終了時間を、
mailContents += Utilities.formatDate(event.getEndTime(),"GMT+0900","HH時mm分") + " : ";
そして件名を、
mailContents += event.getTitle() + "\n";
とします。
終日の予定がある場合、終日の予定を判別する関数を使って、終日予定でない場合にだけ時間をセットするようにします。
if(event.isAllDayEvent() == false){ //終日予定でない場合
//時間のセット
}
そしてこの"mailContents"をメール送信します。
メールの送信は次のようにします。
MailApp.sendEmail(mailto, mailTitle, mailContents);
"mailto"は送信先のメールアドレス、"mailTitle"はメールの件名です。
これを、トリガーを使って、毎日自動で送信します。
スクリプトエディタの左に"<>"みたいなのがありますから、そこにマウスを持っていって「トリガー」をクリックします。
「実行する関数」のところは、もちろんメールを送信する関数をセットします。
「イベントのソースを選択」は「時間主導型」、「時間ベースのトリガーのタイプを選択」は「日付ベースのタイマー」、「時刻を選択」は関数を実行したい時間を入れます。
実行させる時刻に1時間の幅がありますので、 毎日17:00ちょうどに送信するには一工夫必要です。
17:00に実行するトリガーを作成する関数を書いて、この関数をトリガーで前もって起動させるようにします。
function setTrigger(){ //scheduleMailを毎日17:00に呼び出すトリガーを作成する関数
const time = new Date();
time.setHours(17);
time.setMinutes(00);
ScriptApp.newTrigger('scheduleMail').timeBased().at(time).create();
}
つまり、"setTrigger"を毎日17:00よりも前にトリガーで起動するというわけです。
ただし、毎日トリガーが作成されていきますから、"scheduleMail"が実行されたら作成したトリガーを削除するようにした方がいいでしょう。
function delTrigger() { //scheduleMailを呼び出したトリガーを削除する関数
const triggers = ScriptApp.getProjectTriggers();
for(const trigger of triggers){
if(trigger.getHandlerFunction() == "scheduleMail"){
ScriptApp.deleteTrigger(trigger);
}
}
}
休みの日までこんなメールが来るとうんざりしますから、休業日は実行しないように、金曜日には月曜日の予定をメールするように、カレンダーの休業日を判別する工夫も必要でしょう。