GASで特定の休日を除いた営業日の計算
Q&A
Closed
解決したいこと
フォームに書かれてある「完成日」を基準とし、その日から3営業日前に「試作日」を特定してコンソール上に表示する機能をGASで作ろうとしています。
営業日とは①土日と②日本の祝日、③会社独自の休日(2022年12月29日~2023年1月4日。google calendarで予定を作成してある)の3つを除いた日と定義し、それぞれ条件分岐で設定しました。
実行するとだいたいうまくいくのですが、例えば2023年1月10日を完成日として起動すると1月4日が試作日として表示されてしまいます(正しくは12月27日)。
条件分岐などが何か間違っているでしょうか(ちなみに③を12月30日~1月6日に設定すると、正しく12月27日が表示されました)。
ご教示くださると幸いです。
コードは下記になります。
function trialDay() {
var ss_copy = SpreadsheetApp.getActiveSpreadsheet();
var s_name_from = ss_copy.getSheetByName('form');
var lastRow= s_name_from.getLastRow();
var kansei_bi = s_name_from.getRange(lastRow, 1).getValues();
// 基準日を設定
const date = new Date(kansei_bi);
// 基準日が属する月の「完成日」を求める
console.log(Utilities.formatDate(date,'JST','yyyy/MM/dd') + ' です');
// マイナスn営業日である試作期限日を求める
const minus_day = 3; //マイナス3営業日
let cnt = 0;
while (cnt < minus_day) {
if (!isHoliday_(date)) cnt++; //休日でないならcntが1進み、dateが一日戻る
date.setDate(date.getDate()-1);
}
console.log(Utilities.formatDate(date,'JST','yyyy/MM/dd') + ' が試作期限日です。');
}
/**
* 休日か否かを判定する関数
*
* @param {Date} 判定する日付
* @return {boolean} 休日ならtrueを返す
*/
function isHoliday_(date) {
// ①土日の判定
const day = date.getDay(); //曜日取得
if (day === 0 || day === 6) return true;
// ②祝日の判定
const id = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(id);
const events = calendar.getEventsForDay(date);
if (events.length) return true; //なんらかのイベントがある = 祝日
// ③会社独自の休日判定
const id2 = '******************@gmail.com';
const calendar2 = CalendarApp.getCalendarById(id2);
const events2 = calendar2.getEventsForDay(date);
if (events2.length) return true; //なんらかのイベントがある = 休日
}