2022/08/10に更新

【GASで時短】月内の最終営業日を求める

カレンダー業務改善

指定した年、月の最終営業日を調べるGoogle Apps Scriptです。土日と日本の祝日を除いた月内最後の平日を知ることができます。

こんな悩みを解決します


  • 月末の最終営業日を知りたい!
  • 日本の祝日も考慮してほしい!

用意するもの


特にありません。スプレッドシートがあればOKです。

このスクリプトで出来ること


  • 指定した年、月における最終営業日(最後の平日)を求める事ができます。
  • 祝日はGoogleが用意しているカレンダーを参照しているので常に最新(のはず)です。

使い方


1.スクリプトの実行

このスクリプトはコードの変更などは特に必要ありません。さっそく実行してみましょう。
上のメニューにある「スクリプト実行」から「指定した年月の最終営業日を表示する」を実行します。

最終営業日を計算したい年月を聞かれますので好きな値を入れましょう。
月末が土曜日で、その前日が祝日(昭和の日)である2022年4月を指定してみます。

2.結果の確認

処理が終わると「YYYY年MM月の最終営業日はYYYY/MM/DD(曜日)」とメッセージが表示されます。
4/30は土曜日、4/29は昭和の日なので2日前の4/28が返ってきました。問題なさそうです。

3.注意点

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

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp