回答編集履歴
10
追加
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日本の祝日カレンダーがォルトの状態で祝日のみ抽出するようにした
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
|
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
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() %
|
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/1
|
110
|
+
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-10-05/14c47c48-aada-4cdc-b260-e78678aab347.png)
|
7
画像を添付
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
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
祝日のセルの着色の例を追記しました
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
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
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
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
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[
|
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");
|