質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

4396閲覧

Googleカレンダーの予定自動取得およびメール配信について

mitsuba

総合スコア20

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

3クリップ

投稿2018/05/28 01:03

Googleカレンダーより翌日の予定を自動取得し、10時前(7時~9時59分まで)に予定がある場合のみ、
前日の夜にメールが配信される様なツールを作成したいと思っております。

スクリプトを途中まで作成したのですが、以下がどうしても解決できない為、
ご存じの方がいらっしゃいましたら、アドバイスいただけます様、お願いします。

①Googleカレンダーの翌日予定を取得するには、どの様なコードを設定したらよいのでしょうか?
当日の予定は、以下スクリプトで取得できる様になりました。
また、祝日・休日を除く処理をしたいと思い、コードを追加しておりますが、正しいでしょうか?

function fetchSchedules() { // メールアドレス var EMAIL = '*****@*****'; // スプレッドシート:シート名 var SHEET_NAME = 'schedule'; // スプレッドシート:開始位置 var RANGE = 2; // スプレッドシート:時間フォーマット var FORMAT_TIME = 'hh:mm'; // シート情報を取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME).clear(); // カレンダー情報を取得 var calender = CalendarApp.getCalendarById(EMAIL); // 当日の予定を取得 var schedules = calender.getEventsForDay(new Date()); // 祝日・休日を除く処理 var currentDate = new Date(); var weekday = currentDate.getDay(); if (weekday == 0 || weekday == 6) { return; } var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) { return; } // 予定を繰り返し出力する for(var index = 0; index < schedules.length; index++) { var range = RANGE + index; // 開始時間を出力 sheet.getRange(range, 3).setValue(schedules[index].getStartTime()).setNumberFormat(FORMAT_TIME); // 終了時間を出力 sheet.getRange(range, 4).setValue(schedules[index].getEndTime()).setNumberFormat(FORMAT_TIME); // 予定名を出力 sheet.getRange(range, 5).setValue(schedules[index].getTitle()); } }

②①で取得したカレンダーの予定を元に別シートへコピーし、メール本文内に、B2セルの時間とD2セルの時間を
記載したいのですが、メール本文では以下の様な表記となってしまいます。コードの修正で対応が可能でしょうか?

イメージ説明

イメージ説明

function mail_send() { var mySpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var mySheet = mySpreadsheet.getSheetByName("time"); var myEndRow = mySheet.getLastRow(); //最終行取得 var myRange = mySheet.getDataRange(); //sheetの範囲指定(全部) var times = myRange.getDisplayValues(); var myValues = myRange.getValues(); //指定した範囲の値を格納 for (i = 1; i <myEndRow; i++ )  var mail_to="*****@*****,*****@*****"; //メールの送付先(To)を入力 var mail_suject="明日の出勤時間をお知らせ"; //メール件名 var mail_body = "○○さん\n\nお疲れ様です。\n\n明日は、" + myValues[1][1] +"時からの会議がありますので、\n" + myValues[1][3] +"時にご自宅を出発してください。\n\nよろしくお願いします。\n"; MailApp.sendEmail(mail_to, mail_suject, mail_body); }

③①で取得したカレンダーの予定(上記のB2セル)が、10時前(7時~9時59分まで)である場合のみ、
メールを配信する様に設定したいのですが、コードの追加等で対応が可能でしょうか?

ネット検索等で調べたコードを作成しておりますので、素人な考えやコード等になっておりましたら、
申し訳ありませんが、アドバイスいただけましたら幸いです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

GASは詳しくありませんので、コード見た限りのご提案です。※間違っていた場合はご容赦くださいね。

①Googleカレンダーの翌日予定を取得する

// 当日の予定を取得 var schedules = calender.getEventsForDay(new Date());

new Date() は、現在の日時(今日の日付)が入りますね。

「今日の日付」を指定して、「今日の予定」が取れるのであれば、
「取得したい日付」を指定すれば、「取得したい日の予定」が取れるのではないでしょうか。

祝日・休日を除く処理をしたい

// 祝日・休日を除く処理 var currentDate = new Date(); var weekday = currentDate.getDay(); if (weekday == 0 || weekday == 6) { return; } var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) { return; }

コードの正否は、動作確認をすればわかると思いますので、割愛します。

処理の順序としては、

1.取得したい日付を確定する。
2.取得したい日付が、祝日・休日である場合は、処理を抜ける。
3.(処理を抜けずにここに来たなら平日)スケジュールデータを取得する。

とした方が、不要な処理を行わずに済むかと思います。

今の記述順だとスケジュールデータを取得した後に、休日・祝日の判定をしているので、
少なくとも7回に2回(1週間のうちの土日)は、取得したスケジュールデータが無駄になってしまいます。

②①で取得したカレンダーの予定を元に別シートへコピーし、メール本文内に、B2セルの時間とD2セルの時間を記載したい

プログラムにおいて、データとして「時間」だけを表すものは少ないです。
通常「年月日」などの日付データも一緒に持っています。

普通のExcelでも「日時」っぽいものをセルに入力(※書式設定をしていない前提)すると、「今日の〇時〇分」というデータとして識別されているかと思います。

ネットからコードを参照して作られているとのことなので、意識せずに書いたのだと思いますが、シートに繰り返し書き込んでいる部分の例えば開始時間

// 開始時間を出力 sheet.getRange(range, 3).setValue(schedules[index].getStartTime()).setNumberFormat(FORMAT_TIME);

.setNumberFormat(FORMAT_TIME)が、セルに「時間表示」の書式設定をしているようです。
つまり、シートにセットされている値自体は、「日時」であるということになります。

その為valueをそのまま参照しているメールの本文は、

Mon May 28 2018 09:00:00:GMT+0900(JST)

のように「日時」の値がそのまま表示されます。

Date関数を使い、この値を「日時」として正しく取り扱えるようになれば、
年だけ、月だけ、日だけ、時刻だけ・・どのような形でも出力できるようになります。

これが出来れば、

③①で取得したカレンダーの予定(上記のB2セル)が、10時前(7時~9時59分まで)である場合のみ、

メールを配信する様に設定したい(※コードの追加で対応可能ですよ)

こちらにも、つながっていくのではないかと!

投稿2018/05/28 03:44

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuba

2018/06/08 08:52

ご返信が遅くなりまして、大変申し訳ございません。詳細にご回答いただき、ありがとうございました。 今後の参考とさせていただきます。
guest

0

①Googleカレンダーの翌日予定を取得するコード
var targetday = new Date();
targetday.setDate(targetday.getDate() + 1);
var schedules = calender.getEventsForDay(targetday);

②時間の表記を修正するコード
SpreadSheetから取得した日付データは、Dateオブジェクトに変換しないといけない事が分かりまして、
以下の様にコードを修正したら、実装できました。

//取得したセルの値をDateオブジェクト型に変更して処理
var date_meeting_start = new Date(myValues[1][1]);
var date_meeting_start_time = new Date(0,0,0,date_meeting_start.getHours(),date_meeting_start.getMinutes(),0);

//取得したセルの値をDateオブジェクト型に変更して処理
var date_house_start = new Date(myValues[1][3]);
var date_house_start_time = new Date(0,0,0,date_house_start.getHours(),date_house_start.getMinutes(),0);

var mail_body = "○○さん\n\nお疲れ様です。\n\n明日は、" + ("0"+ date_meeting_start_time.getHours()).slice(-2) + ":" + ("0"+ date_meeting_start_time.getMinutes()).slice(-2) +"時からの会議がありますので、\n" + ("0"+ date_house_start_time.getHours()).slice(-2) + ":" + ("0"+ date_house_start_time.getMinutes()).slice(-2) +"時にご自宅を出発してください。\n\nよろしくお願いします。\n";

③10時前の場合のみメールを配信するコード
if(date_meeting_start_time.getHours() <= 9){
MailApp.sendEmail(mail_to, mail_suject, mail_body);

投稿2018/06/08 08:51

mitsuba

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

1: 今日の予定しかとれないのは

javascript

1 // 当日の予定を取得 2 var schedules = calender.getEventsForDay(new Date());

のところで今日を指定しているから。ここで明日を指定すれば可能と思われます。

javascript

1var targetday = new Date(); 2var schedules = calender.getEventsForDay(targetday);

というように可変の構造にしておき、明日ならtargetday.setDate(targetday.getDate() + 1);を挿入する(明後日なら+2などとできる)
2: 可能
例えば"9時"にしたいならmyValues[1][1]のところをmyValue[1][1].getHours()とする(getMinutes()で分もとれます)
3: 可能
おそらくmail_sendのfor文は末尾まで{}で囲うはずですよね。少なくとも今のままだと最初の1件しか通知されないはず。そのどこか(分かりやすいのはsendEmailの直前でしょうか)で、if(myValue[1][1].getHours() < 10) {continue;}とかでスキップする。
(他にもそもそも予定の検索で時間を指定するとかもありかもしれない)

投稿2018/05/28 05:39

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuba

2018/06/08 08:50

ご返信が遅くなりまして、大変申し訳ございません。ご回答いただき、ありがとうございました。 全て解決できたわけではないのですが、解決のヒントをいただきましたので、ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問