コピペで使える! GoogleAppsScriptで日本の祝日を取得すれば営業日判定にもつかえるよ

Sponsored Link

WBSを作ったり、カレンダーを作ったりする際に地味に面倒なのが祝日考慮です。

曜日については土日を休み判定すれば機械的にスケジュールが作れますが、

祝日は自分で調べて手入力だとイケてない。

GoogleAppsScriptでは日本の祝日カレンダーから取得できます。

コピペで使える祝日取得処理

スプレッドシート側の準備

C2に取得開始日、E2に取得終了日を入力して、GASをじっこうすると、祝日一覧が取得できます。

 

// スプレッドシートにメニューを追加する
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "祝日取得",
    functionName : "getJpHolyiday"
  }];
  sheet.addMenu("GoogleAppsScript", entries);
};

function getJpHolyiday() {
  
  //日本の祝日カレンダーを取得
  //アメリカ
 //ja.usa#holiday@group.v.calendar.google.com
 //中国
 //ja.china#holiday@group.v.calendar.google.com
 //台湾
 //ja.taiwan#holiday@group.v.calendar.google.com
  var JP_HOLIDAY_CALENDAR = 'ja.japanese#holiday@group.v.calendar.google.com'

  // シート名
  var SHEET_NAME = 'schedule';
  //開始位置
  var RANGE = 5;
  // フォーマット
  var FORMAT = 'yyyy/mm/dd';
  
  // シート情報を取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  sheet.getRange(5, 2, 300, 2).clearContent();
  sheet.getRange(5, 8, 300, 2).clearContent();
  
  // カレンダー情報を取得
  var jp_calender = CalendarApp.getCalendarById(JP_HOLIDAY_CALENDAR);
  
  // 当日の予定を取得
  var startDate = new Date(sheet.getRange("C2").getValues());
  var endDate = new Date(sheet.getRange("E2").getValues());
  
  var jp_schedules = jp_calender.getEvents(startDate, endDate);
  
  var tmpDate = startDate;
  
  var cnt = 0;
  
  // 祝日を繰り返し出力する
  for(var index = 0; index < jp_schedules.length; index++) {
  
    var range = RANGE + index;
    
    // 日付を出力
    sheet.getRange(range, 2).setValue(jp_schedules[index].getStartTime()).setNumberFormat(FORMAT);
    
    // 予定名を出力
    sheet.getRange(range, 3).setValue(jp_schedules[index].getTitle());
  }
}

2 件のコメント

  • 出力する時はまとめた方が早い。

    var date = [];
    var title = [];
    // 祝日を繰り返し出力する
    for(var i = 0, j = jp_schedules.length; i < j ; index++) {
    // lengthを最初に変数に代入をしとくとさらにいい。

    // 日付
    date.push(jp_schedules[i].getStartTime());

    // 予定名
    title.push(jp_schedules[i].getTitle());
    }
    // まとめて登録!
    sheet.getRange(RANGE, 2, i+1).setValues([date]).setNumberFormat(FORMAT);
    sheet.getRange(RANGE, 3, i+1).setValues([title])

  • 匿名さん

    ご指摘ありがとうございます。
    確かにおっしゃる通りです。
    都度都度セルへ出力するとその分効率が悪いですね……
    匿名さんのコードでしたら、セルへの出力が1回なので処理がはやい!

    ありがとうございました。
    またご指摘いただけると幸いです。

    そしてご指摘いただいた内容を記事させていただきたいです。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください