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