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

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

ただいまの
回答率

90.48%

  • Google Apps Script

    904questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 401

mitsuba

score 12

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分まで)である場合のみ、
メールを配信する様に設定したいのですが、コードの追加等で対応が可能でしょうか?

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

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

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


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

var targetday = new Date();
var 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/06/08 17:50

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

    キャンセル

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/06/08 17:52

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

    キャンセル

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);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    904questions

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