やったこと
画像のような縦長の予定表を作り、土日祝日を色塗りした。
前提:B列4行に日付が記入。B〜K列を色塗り。
流れ
- 日付(Dateオブジェクト)の配列を作成。
- getDay()メソッドを使って0(日曜日)~6(土曜日)からなる配列を作成。
- グーグルカレンダーの「日本の祝日」カレンダーを使って、祝日かそうでないかの配列を作る。
- ↑の2と3の配列の値に応じて、セルを色塗り。
コード
function myFunction() {
//B列の日付取得・Dateオブジェクトの配列作成
var sheet = SpreadsheetApp.getActiveSheet();
var dates = sheet.getRange(4, 2, sheet.getLastRow(),1).getValues().map(function(date, index,array){
return new Date(date);
})
//mapで曜日(0〜6)の配列を作成 → 土日判定に使用
var dayofweek = dates.map(function(date,index,array){
return date.getDay();
})
//mapで祝日か否かの配列作成(True or False)
var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
var isHoliday = dates.map(function(date,index,array){
if(calendar.getEventsForDay(date) != ''){
return true;
}else{
return false;
}
})
//セルを土日祝日に応じて色ぬり。インデックスの+4の行が色ぬり対象。
//日(0)→赤、土(6)→青
for(i=0;i<dates.length-1;i++){
var rng = sheet.getRange(i+4,2,1,10)
if(dayofweek[i]===0){
rng.setBackgroundRGB(234,173,173);
}else if(dayofweek[i]===6){
rng.setBackgroundRGB(170,187,237);
}
//祝日→赤
if(isHoliday[i]){
rng.setBackgroundRGB(234,173,173);
}
}
}
使ったメソッドなど
配列の各要素に関数による処理(Arrayオブジェクトのmapメソッドで)
対象の配列の各要素に対して、引数として渡したコールバック関数の処理がなされ、あらたな配列が返り値になる。forEachは返り値なし。
var result = lists.map(function(value,index,array){
なんらかの処理(元の配列の値value、インデックスindexを使える)
arrayは元の配列のことで、これを使うと元の配列自体を変更できる。
return 結果
})
Dateオブジェクトから曜日を取得(getDayメソッド)
0(日曜日)~6(土曜日)が返ってくる。
var date = new Date('日付')
Logger.log(date.getDay());
Googleカレンダーから特定の日のイベントを取得
祝日のを取得したいときは、カレンダーIDを'ja.japanese#holiday@group.v.calendar.google.com'とする。渡した日付のイベント(この場合祝日)が返ってくる。
期間指定するときは、getEvents(開始日、終了日)とする。イベントの配列が返ってくる。
var calendar = CalendarApp.getCalendarById('カレンダーID');
Logger.log(calendar.getEventsForDay('Dateオブジェクト'))
参考
ありがとうございます。
https://tonari-it.com/gas-is-business-day-calendar/
https://qiita.com/Panda_Program/items/31f331fd4c2f3cfab333