実現したいこと
- スプレッドシートからChatworkに自動通知させたいです。
- 毎日9~10時をトリガー自動で実行する仕様にしています。
- スプレッドシートE列に入れた実行予定日に基づいて通知を行います。
- E列に入れた実行予定日の1日前び実行日のとき「前日通知」の文章を送る
- E列に入れた実行予定日と同じ実行日のとき「当日通知」の文章を送る
- E列に入れた実行予定日が土日の場合はその前の平日の実行日のとき「事前通知」の文章を送る
前提
GASでスプレッドシートからChatworkに自動通知するプログラムを組んでいます。
以下の条件分岐をさせて通知を行いたいのですが、前日通知が送られません。
- E列に入れた実行予定日の1日前び実行日のとき「前日通知」の文章を送る
- E列に入れた実行予定日と同じ実行日のとき「当日通知」の文章を送る
- E列に入れた実行予定日が土日の場合はその前の平日の実行日のとき「事前通知」の文章を送る
スプレッドシートは以下の構成です
実行している日は2023/05/09です
N0. ||ルームID ||通知タイトル ||投稿内容 ||通知トリガー ||実行日時(前日)|| 実行日時(当日)
N0. ||ルームID ||通知タイトル ||投稿内容 ||2023/05/09 || || 13:17:29
N0. ||ルームID ||通知タイトル ||投稿内容 ||2023/05/10 || ||
N0. ||ルームID ||通知タイトル ||投稿内容 ||2023/05/11 || ||
発生している問題・エラーメッセージ
エラーはないのですが、前日通知のIF文に引っかからないようで困っています。
該当のソースコード
function sendExpenseNotification() { // スプレットシート読み込み const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('自動通知'); const lastRow = sheet.getLastRow(); // ChatWorkAPIクライアント作成 const client = ChatWorkClient.factory({ token: token }); // 現在の日付と時刻を取得 const today = new Date(); // スプレッドシートに記載がある分だけ繰り返す for (var i = 2; i <= lastRow; i++) { const [roomId, messageItem, message] = sheet.getRange(i, 2, 1, 3).getValues()[0]; // B列からD列までの値をまとめて取得 const reservationDate = new Date(sheet.getRange(i, 5).getValue()); // E列投稿日 // 前日の場合、メッセージ送信 if (isPreviousDay(reservationDate, today)) { const prevDateMsg = `※連絡※【明日は${messageItem}です】\n${message}`; client.sendMessage({ room_id: roomId, body: prevDateMsg }); // 前日通知実行日時の記録 sheet.getRange(i, 6).setValue(today); } else { // 当日の場合、メッセージ送信 if (isToday(reservationDate, today)) { const todayMsg = `※連絡※【本日は${messageItem}です】\n${message}`; client.sendMessage({ room_id: roomId, body: todayMsg }); // 当日通知実行日時の記録 sheet.getRange(i, 7).setValue(today); } } // 休日ではなく前日の場合、メッセージ送信 if (!isWeekend(reservationDate) && isPreviousDay(reservationDate, today)) { const prevDateMsg = `※連絡※【明日は${messageItem}です】\n${message}`; client.sendMessage({ room_id: roomId, body: prevDateMsg }); // 前日通知実行日時の記録 sheet.getRange(i, 6).setValue(today); } // 休日の場合、前の平日に投稿する if (isWeekend(reservationDate) && isSameMonth(reservationDate, today) && reservationDate < today) { const prevWeekday = getPreviousWeekday(reservationDate); const prevWeekdayMsg = `※連絡※【${messageItem}につきまして】当日は休日のため、前営業日の(${prevWeekday.getMonth() + 1}月${prevWeekday.getDate()}日)に投稿いたします。\n${message}`; client.sendMessage({ room_id: roomId, body: prevWeekdayMsg }); // 休日通知実行日時の記録 sheet.getRange(i, 6).setValue(today); sheet.getRange(i, 7).setValue(today); } } } // 2つの日付が同じ日付かどうかを判定する関数 function isSameDate(date1, date2) { return ( date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate() ); } // 指定された日付が当日かどうかを判定する関数 function isToday(dateToCheck, currentDate) { return isSameDate(dateToCheck, currentDate); } // 指定された日付が前日かどうかを判定する関数 function isPreviousDay(dateToCheck, currentDate) { const previousDate = new Date(currentDate); previousDate.setDate(previousDate.getDate() - 1); return isSameDate(dateToCheck, previousDate); } // 指定された日付が平日(土日でない)かどうかを判定する関数 function isWeekday(dateToCheck) { const day = dateToCheck.getDay(); return day !== 0 && day !== 6; // 0が日曜、6が土曜 } // 指定された日付が土曜日または日曜日かどうかを判定する関数 function isWeekend(dateToCheck) { const day = dateToCheck.getDay(); return day === 0 || day === 6; // 0が日曜、6が土曜 } // 2つの日付が同じ月かどうかを判定する関数 function isSameMonth(date1, date2) { return date1.getMonth() === date2.getMonth(); } // 指定された日付の前の平日(土日を除く前の日)を取得する関数 function getPreviousWeekday(dateToCheck) { const previousDate = new Date(dateToCheck); previousDate.setDate(previousDate.getDate() - 1); while (!isWeekday(previousDate)) { previousDate.setDate(previousDate.getDate() - 1); } return previousDate; }
GAS
試したこと
console.logなどで見てみましたが、日付は読み取っています
通知も当日通知はchatworkに届きました
補足情報(FW/ツールのバージョンなど)
なし
回答1件
あなたの回答
tips
プレビュー