GAS

【GAS】今日の日付から翌営業日を取得する

 GASを使っていると翌営業日を取得する処理を使う事が多いのでメモ…

やりたい事

  • 次の日を休日かどうか判定し、休日だったらその次の日を取得
  • 連休の場合もあるので、上記の処理を営業日まで繰り返す

使用ライブラリ

今回は日付の処理にMoment.jsライブラリを使用しています。
スクリプトID: MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48

休日かどうかを判別する

まずは休日かどうかを判別する処理を作ります。

/**
* 休日かどうかを判定する関数
* @param  {Date}    判定する日付
* @return {boolean} 休日ならtrueを返す
*/
function isHoliday(date) {
  var calendars = CalendarApp.getCalendarsByName("日本の祝日");
  var count = calendars[0].getEventsForDay(date).length;
  var day = date.getDay(); //曜日取得
  return (day === 0 || day === 6 || count === 1); 
}

渡したdateを元に土曜日・日曜日・祝日を判別して真偽を返すだけのシンプルな処理です。

翌営業日を取得する

今日の日付を元に1日後を取得し、先ほど作ったisHoliday()で休日判別します。

/**
* 翌営業日を取得する関数
* @param  {Date}    今日の日付
* @return {Date} 翌営業日の日付
*/
function getNextWorkingDay(date){
  var isHolidayFlag = true;
  var i = 1;
  var next_working_day;
  while(isHolidayFlag){
    next_working_day = Moment.moment(date).clone().add('days',i).toDate();
    isHolidayFlag = isHoliday(next_working_day);
    i++;
  }
  return next_working_day;
}

isHolidayFlagの初期値をtrueにしてwhile()で処理することによって連休にも対応できるようにしてあります。

実行する際の注意点

isHoliday()を使用する際に日付がDate型でないとエラーになるので、Moment.jsのtoDate()を使用してDate型にフォーマットしてから渡します。

function test(){
  var today = Moment.moment().toDate();
  var next_working_day = getNextWorkingDay(today);
  Logger.log(Moment.moment(next_working_day).format());
}

まぁ、普通にnew Date()使えば良いんですが、moment.jsを使った方が、色々と使い回しができそうなのでこの形にしました。

完成

function test(){
  var today = Moment.moment().toDate();
  var next_working_day = getNextWorkingDay(today);
  Logger.log(Moment.moment(next_working_day).format());
}
/**
* 翌営業日を取得する関数
* @param  {Date}    今日の日付
* @return {Date} 翌営業日の日付
*/
function getNextWorkingDay(date){
  var isHolidayFlag = true;
  var i = 1;
  var next_working_day;
  while(isHolidayFlag){
    next_working_day = Moment.moment(date).clone().add('days',i).toDate();
    isHolidayFlag = isHoliday(next_working_day);
    i++;
  }
  return next_working_day;
}
/**
* 休日かどうかを判定する関数
* @param  {Date}    判定する日付
* @return {boolean} 休日ならtrueを返す
*/
function isHoliday(date) {
  var calendars = CalendarApp.getCalendarsByName("日本の祝日");
  var count = calendars[0].getEventsForDay(date).length;
  var day = date.getDay(); //曜日取得
  return (day === 0 || day === 6 || count === 1);  
}

そんなに複雑な処理ではないですが、利用頻度が高そうだったのでまとめておきました。

ABOUT ME
ytakeuchi
都内在住のフロントエンドエンジニア。2016年からフリーランスとして活動中。座右の銘は「昨日よりも楽に」。好きな言葉は「効率化」。こんな性格なのでプライベートではGoogle Apps Scriptばかり触っています。