見出し画像

【GAS】Google Apps Script 活用事例 祝日カレンダーを書き出してみる。

それが、GASなら簡単に日本の祝日の判定ができちゃいます。なぜなら、Googleカレンダーで「日本の祝日」カレンダーが用意されているからです。

祝日カレンダーがGASで書き出せたら、NETWORKDAYS関数などで稼働日数を求めたりするのに使えるなぁと思い、今回は、スプレッドシートに祝日カレンダーを書き出す方法を書いてみようと思います。

2022年11月12日にリライトし、大幅に加筆修正しました。

完成形のスクリプト

function insertNewSheet(){
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const values      = getHolidays_();
  
  try{
    const newSheet = spreadsheet.insertSheet('祝日').activate();
    newSheet.getRange(1, 1, values.length, values[0].length).setValues(values);

  }catch(e){
    console.warn(e);
    showAlert_(values);
    
  }
}


/**
 * 祝日を取得する
 * [[ '勤労感謝の日', '2022-11-23', '祝日' ]]
 * @return {Array.<Array.<string>>}
 * 
 */
function getHolidays_(){
  const cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  const startDate = new Date();
  const endDate   = new Date();
  endDate.setFullYear(endDate.getFullYear()+1);

  const dayOfWeek = '日月火水木金土';
  const daysArray = dayOfWeek.split('');
  const day = (number) => {
    return daysArray[number];
  }

  const events = cal.getEvents(startDate, endDate).map(event => ({
    title: event.getTitle(),
    date:  Utilities.formatDate(event.getStartTime(), 'JST', 'yyyy/MM/dd'),
    day:   day(event.getStartTime().getDay())
    })
  );

  const keys   = Object.keys(events[0]);
  const values = events.map(event => keys.map(key => event[key]));
  values.unshift(['祝日名', '日付', '曜日']);

  console.log(values);
  return values
}



/**
 * シートが存在する場合に、上書きしてもよいかどうか訊く
 * @param {Array.<Array.<string>>} values - [[ '勤労感謝の日', '2022-11-23', '祝日' ]]
 * 
 */
function showAlert_(values){
  const ui = SpreadsheetApp.getUi();
  const response = ui.alert(`シートが既に存在している可能性があります。上書きしますか?`, ui.ButtonSet.YES_NO);

  switch (response){
    case ui.Button.YES:
      console.log('“はい” のボタンが押されました。');
      const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 
      const sheet       = spreadsheet.getSheetByName('祝日').activate();
      sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
      break;

    case ui.Button.NO:
      console.log('“いいえ” のボタンが押されました。');
      ui.alert('処理が中断されました。');
      break;

    default:
    console.log('処理が中断されました。');
  }
}

シートから日付を読み込む場合

const startTime = new Date(sheet.getRange('B1').getValue());
const endTime   = new Date(sheet.getRange('B2').getValue());

B1セルとB2セルから祝日の対象となる期間を読み込みます。

祝日のみ処理をスキップするスクリプト


この記事が気に入ったらサポートをしてみませんか?