Googleカレンダーの予定を取得して毎日の予定をメールで送信する
表題の通りですが、作成してみたいと思います。
新しいプロジェクトを作成
まずは新しいプロジェクトを作成します。
+New project
今回は、スプレッドシートを使用する予定は無いので、スタンドアロンスクリプトで作成します(もしスプレッドシートにデータを残す場合はコンテナバインドスクリプトで作成します)。
コンテナバインドスクリプト
・・・と、思いましたが、上の内容はいったん置いておいて・・・
Googleカレンダーのデータ取得→Googleスプレッドシートにデータを転記→メールで送信
とした方が、後々スプレッドシートのデータを他の事にも使えそうな気がしましたので、スプレッドシートの「コンテナバインドスクリプト」で作成します。
Googleスプレッドシート作成
スクリプトエディタを開きます。
分かりやすいように関数名を変更します。DeliverCalendarEventsSendあたりが分かりやすいでしょうか。
ひとまず許可を与えて、プログラムが実行できる状態にしておきます。
実行ボタンを押します。
許可を与えます。
安全ではないページに移動します。
許可を与えるアカウントを選択すると、スクリプトが実行します。
カレンダーを取得
カレンダーの取得 → イベントの取得とします。
CalendarApp.getCalendarById(‘カレンダーID’)
でカレンダーのデータを取得します。
※IDは設定画面>「カレンダーの統合」に切り替えると「カレンダーID」が表示されます。
デフォルトのカレンダーの場合は、どうやらID=メールアドレスとなっているようです。
var myCal = CalendarApp.getCalendarById(‘XXXXXXXXXX’);
Logger.log(myCal);
変数myCalは、Calenderという値が取得できています。
今日の予定を取得
getEventsForDay()が使えますので、取得します。
//今日の予定を取得する
var myEvents = myCal.getEventsForDay(new Date());
new Date()
現在日時が表示されます。
ここからどうしようか・・・・・・と思っていたら、既に試したいような方法を実践されている方がいらっしゃいましたので参考にさせて頂きました!ありがとうございます!!
イベントのタイトル、開始時間、終了時間を取得
Eventオブジェクト.getTitle()
Eventオブジェクト.getStartTime()
Eventオブジェクト.getEndTime()
予定のタイトル、開始時間、終了時間を取得できます。
1日の予定は複数ありますので、これをfor文で全て取得します。
myEvents.length
(myEvents=変数)これで予定の「数」を取得できます。これをループで回します。
/* イベントの数だけ繰り返し */
for(var i=0;i<myEvents.length;i++){
var strTitle=myEvents[i].getTitle(); //イベントのタイトル
var strStart=HHmm(myEvents[i].getStartTime()); //イベントの開始時刻
var strEnd=HHmm(myEvents[i].getEndTime()); //イベントの終了時刻
}
HHmmは、上記のリンク記事をご参考にさせて頂きました。普通にmyEvents[i].getStartTime()と取得した場合、Wed Aug 30 2019 16:30:35 GMT+0900 (JST)のような感じになってしまい、非常に見づらいです。これを変換する関数を作っておきます。
※直接Utilities.formatDate()しても良いかと思いましたが、別関数に分けた方が分かりやすいです。なるほど、という感じです。
/* 時刻の表記をHH:mmに変更 */
function HHmm(str){
return Utilities.formatDate(str, ‘JST’, ‘HH:mm’);
}
あとは、これをスプレッドシートの行に順番に入れていけば完成、ということになるかと思います。
「タイトル・開始時間・終了時間」
という列の繰り返しのシートを準備して、順番に当てはめていけばよさそうです。
最終行を取得して列に入れる
// ファイルを開く
var spreadsheet = SpreadsheetApp.openById(‘XXXXXXスプレッドシートID’);
var LastRows = spreadsheet.getLastRow();
これで、LastRows には最終行の番号が入ることになります。
最終行+1の行にデータを入れたいので、+1します。
var LastRows = spreadsheet.getLastRow()+1;
あとは、最終行に先ほどのループを使って、順番に当てはめればOKかと思います。
for(var i=0;i<myEvents.length;i++){
var strTitle=myEvents[i].getTitle(); //イベントのタイトル
var strStart=HHmm(myEvents[i].getStartTime()); //イベントの開始時刻
var strEnd=HHmm(myEvents[i].getEndTime()); //イベントの終了時刻
}
ここから、getRangeで行のセルにfor文を使って、データを入れていけばよさそうな気がします。
for(var i=0;i<myEvents.length;i++){
var strTitle=myEvents[i].getTitle(); //イベントのタイトル
var strStart=HHmm(myEvents[i].getStartTime()); //イベントの開始時刻
var strEnd=HHmm(myEvents[i].getEndTime()); //イベントの終了時刻
sheet.getRange(LastRows,i+1).setValue(strTitle); sheet.getRange(LastRows,i+2).setValue(strStart);
sheet.getRange(LastRows,i+3).setValue(strEnd);
}
これでは、うまくいきません。iの値が1ずつ増えていくため、getRangeの列番号がループ毎に1ずつ増えていくので開始時間と終了時間の部分が上書きされてしまいます。
この場合は、開始列が3ずつ増えていけばよいので、開始列を3の倍数にすれば良さそうです。
sheet.getRange(LastRows,(i*3)+1).setValue(strTitle);
sheet.getRange(LastRows,(i*3)+2).setValue(strStart);
sheet.getRange(LastRows,(i*3)+3).setValue(strEnd);
これで、iが1増えるごとにgetRangeの列は3ずつ増えていくので、上手くいきそうな気がします。
上手くいきました\(^o^)/
あとは、この内容をメールの本文にして、1日1回メールで送信させればいい感じになりそうな気がします!
1列目に日付を入れる
後で気付きましたが、このままですと後で見返した時にいつの予定か分からないので、最初の列に日付を入れています。
これは、
var today = new Date();
のような感じで、簡単に取得できます。
var today = new Date();
sheet.getRange(LastRows,1).setValue(today);
/* イベントの数だけ繰り返し */
for(var i=0;i<myEvents.length;i++){
var strTitle = myEvents[i].getTitle(); //イベントのタイトル
var strStart = HHmm(myEvents[i].getStartTime()); //イベントの開始時刻
var strEnd = HHmm(myEvents[i].getEndTime()); //イベントの終了時刻
sheet.getRange(LastRows,(i*3)+2).setValue(strTitle);
sheet.getRange(LastRows,(i*3)+3).setValue(strStart);
sheet.getRange(LastRows,(i*3)+4).setValue(strEnd);
}
のように修正しました。最初の1列目は、日付を入力して、2列目から予定を入力していきます。
このままですと、new Date()が標準の表記になってしまうので、修正します。
var today = Utilities.formatDate(new Date(), ‘JST’, ‘YYYY/MM/dd’);
これで、YYYY/MM/ddの表記に変換されます。
メール送信を設定する
// メール送信先w
var admin_name = ‘本日の予定’ ; // 送信メールの名前
var admin = ‘XXXXXX@gmail.com’; // 送信元アドレス
var message = ”;
var address = ‘XXXXXX@gmail.com’;
var title = ‘本日のスケジュールです。’;
var content = ‘本日のスケジュールです▼\n\n’
+message
+’\n’
+’本日の送信可能件数残:’
MailApp.getRemainingDailyQuota(); //メール送信
GmailApp.sendEmail(address, title, content,
{
from: admin, //fromアドレス
name: admin_name //差出人
}
);
実行すると、自分から自分宛に、こんな感じのメールが届きます。
なんとなく良い感じのような気もします。あとは本文を入れてあげれば完成です。
var message = ”;
/* イベントの数だけ繰り返し */
for(var i=0;i<myEvents.length;i++){
・・・省略・・・
message +=’予定:’+strTitle+’ 開始時間:’+strStart+’ 終了時間:’+strEnd+’\n\n’;
}
出来ましたっ!!
あとは、これにトリガーを仕込んで、1日1回、配信するようにセットすれば完了です!!
編集>現在のプロジェクトのトリガー
「トリガーを追加」
「日付ベースのタイマー」に切り替えます。
好きな時刻(1時間単位・正確な時間は指定できない)を設定します。
「保存」をして完了です。
これで、1日1回(今回の場合は午前7~8時)に毎日自動でメ―ルが配信されるようになります!
1度スクリプトを作り上げると、あとは自動化で便利です!!
ご参考下さい\(^o^)/
追記
終日の「開始時間:00:00 終了時間:00:00」が違和感があるので、この場合は「終日」と表示されるように調整してみます。
終日の場合は、開始時間:00:00 かつ 終了時間:00:00
となるので、これをif文で分岐してみます。
if (strStart === ’00:00′ & strEnd === ’00:00′){
message +=’予定:’+strTitle+’ 終日\n\n’;
}else{
message +=’予定:’+strTitle+’ 開始時間:’+strStart+’ 終了時間:’+strEnd+’\n\n’;
}
出来ました!!あとは文字部分を調整すれば、色々と応用が利きそうです!
ご参考下さい\(^o^)/
※ここまでやって気付きましたが、今回スプレッドシートに入ったデータは全く使っていません。後々、何かに使う時用に参考にして頂ければと思います。
\(^o^)/