LANG SELRCT

コードを書く場所についてはこちら

2018年2月15日木曜日

Google Apps Scriptで指定した期間の営業日を出す(平日・土・日・祝日をそれぞれ分ける)


指定した2つの日付の間に営業日が何日あるかを取得するコードの例です


それを実現するために以下を取得しています
  • 範囲内の日曜日
  • 範囲内の土曜日
  • 範囲内の祝日
  • それ以外は平日=営業日


日曜日と土曜日はnew Date("日付").getDay() で得られる曜日番号で取得しています

祝日はGoogleカレンダーの日本の祝日から取得して public_holidays_obj でオブジェクトにしています



コード.gs
function get_days(){
  var start = "2018/01/01";
  var end = "2018/02/01";
  var start_date = new Date(start);
  var end_date = new Date(end);
  var diff = (end_date - start_date) / 1000 / 60 / 60 / 24;
  var weeks = Math.floor(diff / 7);
  var rest_days = (diff % 7);
  var days_obj = get_each_days(start_date, diff);
  Logger.log([days_obj, days_obj["weekdays"].length])
}

function get_each_days(start_date, diff) {
  var obj = {}
  var sundays = obj["sundays"] = [];
  var saturdays = obj["saturdays"] = [];
  var public_holidays = obj["public_holidays"] = [];
  var weekdays = obj["weekdays"] = [];
  for(var i = 0; i < diff; i++){
    var year_now = start_date.getFullYear();
    var month_now = start_date.getMonth();
    var date_now = start_date.getDate();
    var new_date = new Date(year_now, month_now, date_now + i);
    var day = new_date.getDay();
    var date = Utilities.formatDate(new_date, 'Asia/Tokyo', 'yyyy/MM/dd');
    if(day == 0){
      sundays.push(date);
    }else if(day == 6){
      saturdays.push(date);
    }else if(public_holidays_obj[date]){
      public_holidays.push(date);
    }else{
      weekdays.push(date);
    }
  }
  return obj;
}

var public_holidays_obj =
    {
  "2018/01/01": "元日",
  "2018/01/08": "成人の日",
  "2018/02/11": "建国記念の日",
  "2018/02/12": "建国記念の日 振替休日",
  "2018/03/21": "春分の日",
  "2018/04/29": "昭和の日",
  "2018/04/30": "昭和の日 振替休日",
  "2018/05/03": "憲法記念日",
  "2018/05/04": "みどりの日",
  "2018/05/05": "こどもの日",
  "2018/07/16": "海の日",
  "2018/08/11": "山の日",
  "2018/09/17": "敬老の日",
  "2018/09/23": "秋分の日",
  "2018/09/24": "秋分の日 振替休日",
  "2018/10/08": "体育の日",
  "2018/11/03": "文化の日",
  "2018/11/23": "勤労感謝の日",
  "2018/12/23": "天皇誕生日",
  "2018/12/24": "天皇誕生日 振替休日"
}
意訳
この機能がやること
startの日付を決める
endの日付を決める(この日付になるまで)
new Dateにstartを渡して
new Dateにendを渡して
その日数を計算して(ミリ秒で出るので÷1000で秒に、÷60で分に、÷60で時間に、÷24で日数になる)
その日数を7で割って何週間か計算して
あまった日数を計算して
get_each_daysにstart_date, diffを渡して
返ってきたオブジェクトとweekdaysの数をログに出す


この機能がやること
以下のオブジェクトを用意する
obj = { sundays: [],
saturdays: [],
public_holidays: [],
weekdays: [] } 
渡されたdiff(日数)の数だけ以下を繰り返す
渡されたstart_dateの西暦を取得して
月を取得して
日付を取得して
日付に1ずつ日数を足して
曜日の番号を取得→ 0 は日曜日で 1は月曜日~ 6 は土曜日
yyyy/MM/ddの形にフォーマットして
もし0なら(日曜日なら)
sundaysの配列に追加して
もし6なら(土曜日なら)
saturdaysの配列に追加して
もしpublic_holidays_objにあれば
public_holidays配列に追加して
それ以外なら
weekdays配列に追加する


出来上がったobjを返す


public_holidays_objのオブジェクトを用意する

























実行結果
日曜日、土曜日、平日、祝日のそれぞれの日付と
weekdaysのlengthで取得した日数がログに出ます


関連記事

Googleカレンダーで日本の祝日を取得してJSONで保存する
Utilities.formatDate()で日付をフォーマットする


参考

Date.prototype.getDay()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay