1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【スプレッドシート】予定表の日付が土日祝日かを判定してセルを色分け

Last updated at Posted at 2019-09-06

やったこと

画像のような縦長の予定表を作り、土日祝日を色塗りした。
前提:B列4行に日付が記入。B〜K列を色塗り。
スクリーンショット 2019-09-06 22.00.53.png

流れ

  1. 日付(Dateオブジェクト)の配列を作成。
  2. getDay()メソッドを使って0(日曜日)~6(土曜日)からなる配列を作成。
  3. グーグルカレンダーの「日本の祝日」カレンダーを使って、祝日かそうでないかの配列を作る。
  4. ↑の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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?