【GAS】Google Apps Script 活用事例 祝日カレンダーを書き出してみる。
祝日カレンダーが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セルから祝日の対象となる期間を読み込みます。
祝日のみ処理をスキップするスクリプト
この記事が気に入ったらサポートをしてみませんか?