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

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

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

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

1回答

558閲覧

GASを使ったスプレッドシートからChatworkに自動通知ツール

Rin22209853

総合スコア4

Google Apps Script

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

3クリップ

投稿2023/05/09 04:35

編集2023/05/09 04:38

実現したいこと

  • スプレッドシートから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/ツールのバージョンなど)

なし

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

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

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

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

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

YellowGreen

2023/05/09 06:39 編集

2023/05/10と2023/05/09とを比較して前日かどうかを確認するコードをお考えなら、 isPreviousDayは、 今日の日付を1日進めて( + 1) から比較すべきではないですか?
YellowGreen

2023/05/09 05:00

あるいは、引数を逆にするとか?
Rin22209853

2023/05/09 06:58

ありがとうございます…!!!失念しておりました… +1で解決しました。 本当にありがとうございました。
YellowGreen

2023/05/09 13:19

解決したのであれば、解決済みにされてはいかがですか。
Rin22209853

2023/05/09 13:38

申し訳ございません。 解決済みにいたしました。 ご指摘いただきありがとうございました。 またコードのアドバイスありがとうございました。
guest

回答1

0

自己解決

YellowGreenさん回答の以下の内容で解決しました
2023/05/09 15:39 編集

2023/05/10と2023/05/09とを比較して前日かどうかを確認するコードをお考えなら、
isPreviousDayは、
今日の日付を1日進めて( + 1) から比較すべきではないですか?

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

投稿2023/05/09 13:35

Rin22209853

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問