
土・日・祝日でない最終営業日を取得するスクリプト
ノンプロ研でGAS勉強中です。
その月の最終営業日にだけする処理をGASで自動化したいという場合にトリガーの設定のために最終営業日を取得する必要があります。
最終営業日は、土・日・祝日でない月末日にもっとも近い日付として、そのDateオブジェクトを取得します。
例によって、ネットの海に素敵なコードを流している方がいて、今回はそのコピペです。
こちらの記事の lastBusinessDay の部分ですね。
ただ、書いてあるコードを理解しなければ成長はない!と読み解くのに、これまたいつもの「いつも隣にITのお仕事」の記事を参照しました。
コードとしてはこんな感じです(事実上のコピペです)
// 土日祝を除く最終営業日を戻り値として返す関数
function thisLastBizDay() {
// 判定基準日となる今日を取得
const today = new Date();
// 月末日を取得(翌月初日から-1日)
const lastDay = new Date(today.getFullYear(), today.getMonth() + 1, 0);
// 日本の祝日カレンダーを取得
const calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
// 最終営業日に月末日を代入し、曜日・祝日該当を判定していく
let lastBizDay = lastDay;
for (let i = 1; i < 30; i++) {
// 月末日の曜日を判定して平日かつ祝日に該当しない場合は最終営業日とする。
// getDay()メソッド:日曜日を0として土曜日6まで数値を返す
let dayOWeek = lastBizDay.getDay();
// 条件分岐で日曜日・土曜日・日本の祝日の該当日であった場合は1日ずらす
if (dayOWeek == 0 || dayOWeek == 6 || calJa.getEventsForDay(lastBizDay).length > 0) {
lastBizDay = new Date(today.getFullYear(), today.getMonth() + 1, -1 * i);
continue;
}
break;
}
return lastBizDay; //例:Mon May 31 2021 00:00:00 GMT+0900 (Japan Standard Time)
}
このコードの目からうろこのポイントは2つ。
const lastDay = new Date(today.getFullYear(), today.getMonth() + 1, 0);
今日を基準にDate() コンストラクターの引数の月指定の部分を+1(翌月にする)のと日付指定の部分を0にする(1日バックデートされる)の組み合わせで今月の末日を取得する点です。
2点目は、土日祝日判定の条件分岐で
calJa.getEventsForDay(lastBizDay).length > 0
該当日が指定したカレンダーにイベント(予定)があるかを判定している点です。
これを応用すれば、会社独自の休日などのカレンダーを祝日判定のカレンダーに指定して、一般的な祝日以外の休日にも対応できる点です。
↓変更する部分↓ カレンダーのIDを変更すればOK
const calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
日本の祝日カレンダーは、年末年始やお盆などの慣習的な休日には対応していないので、私も年末までには対応しないとなーと思っています。
GASはノンプロ研で勉強させてもらっています。