指定した年、月の最終営業日を調べるGoogle Apps Scriptです。土日と日本の祝日を除いた月内最後の平日を知ることができます。
特にありません。スプレッドシートがあればOKです。
このスクリプトはコードの変更などは特に必要ありません。さっそく実行してみましょう。
上のメニューにある「スクリプト実行」から「指定した年月の最終営業日を表示する」を実行します。
最終営業日を計算したい年月を聞かれますので好きな値を入れましょう。
月末が土曜日で、その前日が祝日(昭和の日)である2022年4月を指定してみます。
処理が終わると「YYYY年MM月の最終営業日はYYYY/MM/DD(曜日)」とメッセージが表示されます。
4/30は土曜日、4/29は昭和の日なので2日前の4/28が返ってきました。問題なさそうです。
Googleが提供している「日本の祝日」カレンダーは、おおよそ1年〜1年半先までしか祝日が登録されていません。そのため1年以上先の月を指定すると正しい結果が返ってこない可能性があります。
/**
* このスクリプトの説明、使い方はこちら。
* https://myfunc.jp/items/00128/index.html
*/
function onOpen() {
// スプレッドシートを開いたときに実行される関数
// UIの取得
const ui = SpreadsheetApp.getUi()
// メニューの表示名
const menu = ui.createMenu('スクリプト実行');
// メニューに追加するボタン
menu.addItem('指定した年月の最終営業日を表示する', 'get_last_business_day');
// メニューを画面に追加する
menu.addToUi();
}
function get_last_business_day() {
// プロンプトを表示するためにUIをオブジェクトを取得
const ui = SpreadsheetApp.getUi();
// 最終営業日を知りたい年月を入力するプロンプトを表示
const response = ui.prompt('最終営業日を知りたい年月を入力してください', '2022/7 のように半角数字とスラッシュで入力してください', ui.ButtonSet.OK_CANCEL);
// キャンセルボタンが押されたらスクリプトを終了する
if (response.getSelectedButton() == ui.Button.CANCEL) {
return;
}
// 入力された年月から、年と月を取り出す
const input_yyyy = response.getResponseText().match(/^([0-9]{4})\/[0-9]{1,2}$/)[1];
const input_mm = response.getResponseText().match(/^[0-9]{4}\/([0-9]{1,2})$/)[1];
// 取り出した年と月からdateオブジェクトを作成。日はいつでもよいので1日とする
const date = new Date(input_yyyy, input_mm - 1, 1);
// 指定年月の最終日を取得する
let last_day = new Date(date.getFullYear(), date.getMonth() + 1, 0);
// 日本の祝日カレンダーを参照するため、カレンダーIDをセット
const calendar_id = 'ja.japanese#holiday@group.v.calendar.google.com';
// 未登録のカレンダーは取得不可能なため、登録する
CalendarApp.subscribeToCalendar(calendar_id);
// カレンダーを取得する
const calendar = CalendarApp.getCalendarById(calendar_id)
// 指定月の最終日を起点とし、最終営業日を見つける
// 土日祝であれば日付を1日戻し、平日が見つかったらループをブレイクする
while (true) {
// 曜日を取得
let day_of_the_week = last_day.getDay(); // 0:日曜 〜 6:土曜
// カレンダーからイベントを取得するための範囲を定義
// 営業日を検索中の日付の0時から23時59分までのイベントを対象とする
let period_from = new Date(last_day.getFullYear(), last_day.getMonth(), last_day.getDate(), 0, 0, 0);
let period_to = new Date(last_day.getFullYear(), last_day.getMonth(), last_day.getDate(), 23, 59, 59);
// イベントを取得する
let events = calendar.getEvents(period_from, period_to);
// 土日か日本の祝日にイベントがある場合は営業日ではない
if (day_of_the_week == 0 || day_of_the_week == 6 || events.length > 0) {
// 日付を1日戻して(例:31日から30日に戻す)引き続きループ
last_day.setDate(last_day.getDate() - 1);
continue;
} else {
// 3条件にマッチしなかった = 普通の平日なのでループを解除する
break;
}
}
// 曜日を表示するため、getDay()で返ってくる数字に対応する日本語曜日を配列に入れる
const days_japanese = ['日', '月', '火', '水', '木', '金', '土'];
// 結果本文を作成する
const message = `
${input_yyyy}年${input_mm}月の最終営業日は、${Utilities.formatDate(last_day, 'JST', 'yyyy/MM/dd')}(${days_japanese[last_day.getDay()]})です。
`;
// 結果を画面上に表示する
ui.alert(message);
}
年と月を指定すると、セルにカレンダーが出現するGoogle Apps Scriptです。カレンダーを入れたくなって調べてみたら標準機能にはなく、数式でやるにも結構面倒な感じだったので一発で作ってくれるGASを書いてみました。想像の3倍は面倒でした・・・。
指定した年の12ヶ月分のカレンダーを生成してくれるGoogle Apps Scriptです。前回作成した「指定した月のカレンダーを生成する」スクリプトをベースに、1年分出力するように変更してみました。横3 ✕ 縦4の形式で生成されます。
Googleが用意してくれている祝日カレンダーをもとに、1年間の祝日をスプレッドシートに出力するGoogle Apps Scriptです。 祝日は年によって変わったりするので確認が面倒なのと、国外との取引がある時にその国の祝日がわかれば便利だなと思い作成しました。
指定した年、月の第1営業日を調べるGoogle Apps Scriptです。土日や休日を考慮した最初の営業日(平日)を知ることが出来ます。