以前、ネット上の記事に紹介されていたものにほんの少しだけ手を加えたものです。
本当はその記事を紹介すべきでしょうが、出典を忘れてしまいました。
(日本語プログラミング言語「なでしこ」で高名な、
くじら飛行机さんの連載だった気がします。)
Google
1
2// 年間カレンダーを作成する 祝日も自動的に取得する
3
4function makeYearCalendar() {
5
6 var T_YEAR = 2021; // 年度を指定
7 var T_MONTH = 4; // 4月はじまりのカレンダーにする
8
9
10 // 曜日と色を指定
11 var WEEK_NAMES = ["日","月","火","水","木","金","土"];
12 var WEEK_BACKCOLORS = ["#ffc0c0","","","","","","#bbfaff"];//曜日ごとの背景色の指定 日曜日をピンク 土曜日を水色に、それ以外は無色
13
14 //下線を何列引くか指定
15 var cols=10
16
17
18 var sheet = SpreadsheetApp.getActiveSheet(); //グーグルSpreadsheetアプリの現在アクティブなシートに作る
19
20 // いつからいつまでのカレンダーを作るか
21 var d_start = new Date(T_YEAR, T_MONTH - 1, 1);
22 var d_end = new Date(T_YEAR + 1, T_MONTH - 2, 31, 23, 59, 59);//1年後の1日前の日付になるようにしている
23
24 // 日本の祝日カレンダーから祝日を取得
25 var holidays = {};//取得した祝日の一覧を収納するための配列を準備
26 var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
27 var events = cal.getEvents(d_start, d_end);//カレンダー作成期間中の祝日などを取得
28 for (var i in events) {
29 var e_title = events[i].getTitle();
30 var e_start = events[i].getStartTime();
31 var e_m = e_start.getMonth() + 1;
32 var e_d = e_start.getDate();
33 holidays[e_m + "/" + e_d] = e_title;//何月何日が何という祝日かという配列の形で保存
34 }
35
36 // 一覧表を配列として作る
37 var result = [], colors = [];//処理の結果を格納する2つの配列を準備する
38 var row = 2;//下線を引くために、行を示す変数を指定、1行目はタイトル行なので初期値は2
39 var t = new Date(d_start.getTime());//開始日から始まる日付変数 以下でwhile式を使って終了日まで繰り返す
40
41 while (t.getTime() < d_end.getTime()) {//指定した最終日になるまで処理を繰り返す
42 var y = t.getFullYear();//作成後にフィルター機能を使いやすいよう、以下で年月日を分けることにする。この行は年を取得
43 var m = t.getMonth() + 1;
44 var d = t.getDate();
45 var w = t.getDay();//曜日を示す0~6までの数値を取得(0が日曜日・1が月曜日……6が土曜日)
46 var wn = WEEK_NAMES[w];//曜日を示す0~6までの数字を配列WEEK_NAMESで指定した日~土の一文字の漢字に変換する
47 var c = WEEK_BACKCOLORS[w]; // 背景色の指定 曜日を示す0~6までの数字を配列WEEK_BACKCOLORSで指定した曜日ごとの色にする この時点ではどの色か決めているだけ
48 // var wnum = Math.ceil((((t-d_start)/86400000))/7);//第何週か
49
50 // 月曜日なら罫線を引く
51 if (w == 1) {
52 sheet.getRange(row, 1, 1, cols).setBorder(true, null, null, null, null, null);
53 }
54
55 //祝日判定 取得した祝日の一覧にその日がないなら空欄にし、その日が祝日なら黄色に指定
56 var ev = holidays[m + "/" + d];
57 if (typeof(ev) == "undefined") {
58 ev = "";
59 } else {
60 c = "yellow";
61 }
62
63 // カレンダー本体の情報(年月日、曜日、祝日)を格納する
64 result.push([y,m,d,wn,"","","","","",ev]);//""の部分は午前・午後・晩などの部分
65
66 // 色の配列に曜日指定、祝日判定で指定でした色を格納する resultに合わせて 列分を指定する
67 colors.push([c,c,c,c,c,c,c,c,c,c]);
68
69 // 一日進める
70 t.setTime(t.getTime() + 1000 * 60 * 60 * 24);
71 row++;
72 }
73
74 // 表に設定する
75 sheet.getRange(1,1,1,cols).setValues([["年","月","日","曜","AM","AM","PM","PM","晩","祝日"]]);//タイトル行
76 sheet.getRange(1,1,1,cols).setBorder(true, null, true, null, null, null);//タイトル行の上と下に罫線を引く
77 sheet.getRange(2, 1, result.length, cols).setValues(result);//カレンダー本体の情報を設定
78 sheet.getRange(2,1, colors.length,cols).setBackgrounds(colors);// 色の配列に従って背景色を指定
79}