回答編集履歴

10

追加

2024/10/09 11:48

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -107,3 +107,80 @@
107
107
  ```
108
108
  B列を日付データ、A列とC列を計算式にしても画面表示は同じようにできます
109
109
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-10-05/14c47c48-aada-4cdc-b260-e78678aab347.png)
110
+
111
+ ----
112
+ 三つとも一緒に実行する例です
113
+ 先のと手法を変えてみました参考になれば…
114
+ ```JavaScript
115
+ // 土日の行と祝日のセルの背景色を指定の色にする
116
+ // 毎月の1日の行の上に枠線(太罫線)を引く
117
+ // ------------------------------
118
+ // 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する
119
+ // 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める
120
+ // B10セルの値: 2024/09/01
121
+ // B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると
122
+ // 日のみの表示となる
123
+ // A10セルの計算式: =MONTH(B10)
124
+ // C10セルの計算式: =TEXT(B10,"ddd")
125
+ // 10行目以下の行は、オートフィルで10行目からコピペ
126
+ function execAllFunction() {
127
+ // データ範囲
128
+ const dataRange = 'A10:ZZ100';
129
+ // 日付の列
130
+ const dateColumn = 2;
131
+ const dateColumnName = 'B';
132
+ // 背景色
133
+ const weekendColor = 'lightgray';
134
+ const holidayColor = 'aquamarine';
135
+ // 枠線の初期設定
136
+ const borderPosition = new Map([
137
+ ['top', true],
138
+ ['left', null],
139
+ ['bottom', null],
140
+ ['right', null],
141
+ ['vertical', null],
142
+ ['horizontal', null]
143
+ ]).values();
144
+ const borderColor = 'black';
145
+ const borderStyle = SpreadsheetApp.BorderStyle.SOLID_THICK;
146
+
147
+ // 記入されている日付の範囲内の祝日リストを取得する
148
+ const sheet = SpreadsheetApp.getActiveSheet();
149
+ const values = sheet.getRange(1, dateColumn, sheet.getLastRow(), 1)
150
+ .getValues().flat();
151
+ const firstDate = values.find(v => !isNaN(new Date(v).getDate()));
152
+ const lastDate = values.findLast(v => !isNaN(new Date(v).getDate()));
153
+ const holidays = CalendarApp
154
+ .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
155
+ .getEvents(firstDate, lastDate)
156
+ .filter(v => v.getDescription() === '祝日')
157
+ .map(v => v.getStartTime().getTime());
158
+
159
+ // 土日の行、祝日のセル、1日の行のセル範囲名を配列に蓄積
160
+ const weekendsRangeNames = [];
161
+ const holidaysRangeNames = [];
162
+ const firstDayRangeNames = [];
163
+ values.forEach((v, i) => {
164
+ const date = new Date(v);
165
+ // 土日と1日の行と祝日のセルの範囲名を取得する
166
+ if (date.getDay() % 6 === 0) {
167
+ weekendsRangeNames.push((i + 1) + ':' + (i + 1));
168
+ }
169
+ if (holidays.includes(date.getTime())) {
170
+ holidaysRangeNames.push(dateColumnName + (i + 1));
171
+ }
172
+ if (date.getDate() === 1) {
173
+ firstDayRangeNames.push((i + 1) + ':' + (i + 1));
174
+ }
175
+ });
176
+
177
+ // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色)
178
+ sheet.getRange(dataRange).setBackground(null);
179
+ sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor);
180
+ sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor);
181
+
182
+ // 枠線を引く
183
+ sheet.getRangeList(firstDayRangeNames)
184
+ .setBorder(...borderPosition, borderColor, borderStyle);
185
+ }
186
+ ```

9

Google日本の祝日カレンダーがォルトの状態で祝日のみ抽出するようにした

2024/10/05 08:22

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -84,11 +84,10 @@
84
84
  const firstDate = values.find(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn -1];
85
85
  const lastDate = values.findLast(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn - 1];
86
86
  const holidays = CalendarApp
87
- .getCalendarById('ja.japanese.official#holiday@group.v.calendar.google.com')
87
+ .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
88
- // 次の行でエラーが発生する時は、
89
- // Googleカレンダーの祝日カレンダーの設定(︙)で「祝日カレンダーのコンテンツ」を「祝日のみ」に設定
90
88
  .getEvents(firstDate, lastDate)
89
+ .filter(v => v.getDescription() === '祝日')
91
- .map(v => v.getStartTime().getTime())
90
+ .map(v => v.getStartTime().getTime());
92
91
 
93
92
  // 土日と祝日の範囲名を取得する
94
93
  const weekendsRangeNames = values

8

2024/10/05 08:08

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  // 土日と祝日の範囲名を取得する
94
94
  const weekendsRangeNames = values
95
- .map((v, i) => new Date(v[dateColumn -1]).getDay() % 7 == 0 ? i + 1 : 0)
95
+ .map((v, i) => new Date(v[dateColumn -1]).getDay() % 6 == 0 ? i + 1 : 0)
96
96
  .filter(v => v > 0)
97
97
  .map(v => v + ':' + v);
98
98
  const holidaysRangeNames = values
@@ -107,4 +107,4 @@
107
107
  }
108
108
  ```
109
109
  B列を日付データ、A列とC列を計算式にしても画面表示は同じようにできます
110
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-10-05/1045418b-951c-4e9d-ba85-5c9a7f24bef6.png)
110
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-10-05/14c47c48-aada-4cdc-b260-e78678aab347.png)

7

画像を添付

2024/10/05 08:05

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -106,3 +106,5 @@
106
106
  sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor);
107
107
  }
108
108
  ```
109
+ B列を日付データ、A列とC列を計算式にしても画面表示は同じようにできます
110
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-10-05/1045418b-951c-4e9d-ba85-5c9a7f24bef6.png)

6

2024/10/05 04:47

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -83,8 +83,6 @@
83
83
  const values = sheet.getDataRange().getValues();
84
84
  const firstDate = values.find(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn -1];
85
85
  const lastDate = values.findLast(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn - 1];
86
- console.log(firstDate);
87
- console.log(lastDate);
88
86
  const holidays = CalendarApp
89
87
  .getCalendarById('ja.japanese.official#holiday@group.v.calendar.google.com')
90
88
  // 次の行でエラーが発生する時は、

5

祝日のセルの着色の例を追記しました

2024/10/05 04:40

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -48,3 +48,63 @@
48
48
  menu.addToUi();
49
49
  }
50
50
  ```
51
+ なお、
52
+ 参考までに土日の行の背景色と祝日のセルの背景色を一括で着色することも可能です…。
53
+ この場合は、祝日の判定をGoogleカレンダーで行うので、スプレッドシートを少し修正する必要があります
54
+
55
+ 具体的には、B列(日)の値を1…31などの数値ではなく
56
+ 2024/09/01などの日付として記入した上で、表示形式で1…31の表示にしておき
57
+ A列の月とC列の曜は計算式で表示するようにします。
58
+ スクリプトではB列の日付データの値から曜日と祝日を判定して着色するセル範囲を求めます
59
+
60
+ コードの参考例です
61
+ ```JavaScript
62
+ // 土日の行と祝日のセルの背景色を指定の色にする
63
+ // ------------------------------
64
+ // 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する
65
+ // 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める
66
+ // B10セルの値: 2024/09/01
67
+ // B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると日のみの表示となる
68
+ // A10セルの計算式: =MONTH(B10)
69
+ // C10セルの計算式: =TEXT(B10,"ddd")
70
+ // 10行目以下の行は、オートフィルで10行目からコピペ
71
+ function colorDate() {
72
+ // データ範囲
73
+ const dataRange = 'A10:ZZ100';
74
+ // 日付の列
75
+ const dateColumn = 2;
76
+ const dateColumnName = 'B';
77
+ // 背景色
78
+ const weekendColor = 'lightgray';
79
+ const holidayColor = 'aquamarine';
80
+
81
+ // 記入されている日付の範囲内の祝日リストを取得する
82
+ const sheet = SpreadsheetApp.getActiveSheet();
83
+ const values = sheet.getDataRange().getValues();
84
+ const firstDate = values.find(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn -1];
85
+ const lastDate = values.findLast(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn - 1];
86
+ console.log(firstDate);
87
+ console.log(lastDate);
88
+ const holidays = CalendarApp
89
+ .getCalendarById('ja.japanese.official#holiday@group.v.calendar.google.com')
90
+ // 次の行でエラーが発生する時は、
91
+ // Googleカレンダーの祝日カレンダーの設定(︙)で「祝日カレンダーのコンテンツ」を「祝日のみ」に設定
92
+ .getEvents(firstDate, lastDate)
93
+ .map(v => v.getStartTime().getTime())
94
+
95
+ // 土日と祝日の範囲名を取得する
96
+ const weekendsRangeNames = values
97
+ .map((v, i) => new Date(v[dateColumn -1]).getDay() % 7 == 0 ? i + 1 : 0)
98
+ .filter(v => v > 0)
99
+ .map(v => v + ':' + v);
100
+ const holidaysRangeNames = values
101
+ .map((v, i) => holidays.includes(new Date(v[dateColumn - 1]).getTime()) ? i + 1 : 0)
102
+ .filter(v => v > 0)
103
+ .map(v => dateColumnName + v);
104
+
105
+ // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色)
106
+ sheet.getRange(dataRange).setBackground(null);
107
+ sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor);
108
+ sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor);
109
+ }
110
+ ```

4

2024/10/05 02:42

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -14,7 +14,6 @@
14
14
  const bgColor = 'lightgray';
15
15
 
16
16
  const sheet = SpreadsheetApp.getActiveSheet();
17
- sheet.getRange(dataRange).setBackground(null);
18
17
 
19
18
  // 曜日の列のセルが指定の文字を含む行のセル範囲名( '10:10' などの行全体の指定 )を取得
20
19
  const rangeNames = sheet.getDataRange()

3

2024/10/04 23:58

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -38,6 +38,7 @@
38
38
  menu.addItem("新シート作成", "Copysheet");
39
39
  menu.addItem("7日間削除", "DeleteRow");
40
40
  menu.addItem("空いた分罫線追加", "PlusBoder");
41
+ // ★ ここも関数名を変えます ★
41
42
  menu.addItem("土日色付け(ボタン調整中)", "colorWeekend");
42
43
  menu.addItem("祝日色付け(条件付き書式調整中)", "関数名その3");
43
44
  menu.addItem("1日の上に太線(やり方調べ中)", "関数名その3");

2

2024/10/04 23:45

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -16,7 +16,7 @@
16
16
  const sheet = SpreadsheetApp.getActiveSheet();
17
17
  sheet.getRange(dataRange).setBackground(null);
18
18
 
19
- // 曜日の列のセルが指定の文字を含む行のセル範囲リストを取得
19
+ // 曜日の列のセルが指定の文字を含む行のセル範囲名( '10:10' などの行全体の指定 )を取得
20
20
  const rangeNames = sheet.getDataRange()
21
21
  .getValues()
22
22
  .map((v, i) => v[weekColumn -1] && keyword.includes(v[weekColumn - 1]) ? i + 1 : 0)

1

2024/10/04 23:42

投稿

YellowGreen
YellowGreen

スコア800

test CHANGED
@@ -6,6 +6,8 @@
6
6
  function colorWeekend() {
7
7
  // データ範囲を指定
8
8
  const dataRange = 'A10:ZZ100'
9
+ // 曜日の列を指定(C列: 3)
10
+ const weekColumn = 3;
9
11
  // 色を変える曜日の文字を指定
10
12
  const keyword = '土日';
11
13
  // 背景色を指定
@@ -17,7 +19,7 @@
17
19
  // 曜日の列のセルが指定の文字を含む行のセル範囲リストを取得
18
20
  const rangeNames = sheet.getDataRange()
19
21
  .getValues()
20
- .map((v, i) => v[2] && keyword.includes(v[2]) ? i + 1 : 0)
22
+ .map((v, i) => v[weekColumn -1] && keyword.includes(v[weekColumn - 1]) ? i + 1 : 0)
21
23
  .filter(v => v > 0)
22
24
  .map(v => v + ':' + v);
23
25
 
@@ -36,7 +38,6 @@
36
38
  menu.addItem("新シート作成", "Copysheet");
37
39
  menu.addItem("7日間削除", "DeleteRow");
38
40
  menu.addItem("空いた分罫線追加", "PlusBoder");
39
- // ★ ここも関数名を変えます ★
40
41
  menu.addItem("土日色付け(ボタン調整中)", "colorWeekend");
41
42
  menu.addItem("祝日色付け(条件付き書式調整中)", "関数名その3");
42
43
  menu.addItem("1日の上に太線(やり方調べ中)", "関数名その3");