同じ名前の他の関数があるか、メニューから試行中の別な関数を起動しているか
どちらかでしょうか
例えば、関数名を変えてみた次のコードをお試しください
JavaScript
1function colorWeekend() {
2 // データ範囲を指定
3 const dataRange = 'A10:ZZ100'
4 // 曜日の列を指定(C列: 3)
5 const weekColumn = 3;
6 // 色を変える曜日の文字を指定
7 const keyword = '土日';
8 // 背景色を指定
9 const bgColor = 'lightgray';
10
11 const sheet = SpreadsheetApp.getActiveSheet();
12
13 // 曜日の列のセルが指定の文字を含む行のセル範囲名( '10:10' などの行全体の指定 )を取得
14 const rangeNames = sheet.getDataRange()
15 .getValues()
16 .map((v, i) => v[weekColumn -1] && keyword.includes(v[weekColumn - 1]) ? i + 1 : 0)
17 .filter(v => v > 0)
18 .map(v => v + ':' + v);
19
20 // 着色する
21 sheet.getRange(dataRange).setBackground(null);
22 sheet.getRangeList(rangeNames).setBackground(bgColor);
23}
24
25function onOpen() {
26 var ui = SpreadsheetApp.getUi()
27
28 //メニュー名を決定
29 var menu = ui.createMenu("シート更新");
30
31 //メニューに実行ボタン名と関数を割り当て
32 menu.addItem("新シート作成", "Copysheet");
33 menu.addItem("7日間削除", "DeleteRow");
34 menu.addItem("空いた分罫線追加", "PlusBoder");
35 // ★ ここも関数名を変えます ★
36 menu.addItem("土日色付け(ボタン調整中)", "colorWeekend");
37 menu.addItem("祝日色付け(条件付き書式調整中)", "関数名その3");
38 menu.addItem("1日の上に太線(やり方調べ中)", "関数名その3");
39 menu.addItem("まとめて一気に実行(やり方調べ中)", "関数名その3");
40
41
42 //スプレッドシートに反映
43 menu.addToUi();
44}
なお、
参考までに土日の行の背景色と祝日のセルの背景色を一括で着色することも可能です…。
この場合は、祝日の判定をGoogleカレンダーで行うので、スプレッドシートを少し修正する必要があります
具体的には、B列(日)の値を1…31などの数値ではなく
2024/09/01などの日付として記入した上で、表示形式で1…31の表示にしておき
A列の月とC列の曜は計算式で表示するようにします。
スクリプトではB列の日付データの値から曜日と祝日を判定して着色するセル範囲を求めます
コードの参考例です
JavaScript
1// 土日の行と祝日のセルの背景色を指定の色にする
2// ------------------------------
3// 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する
4// 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める
5// B10セルの値: 2024/09/01
6// B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると日のみの表示となる
7// A10セルの計算式: =MONTH(B10)
8// C10セルの計算式: =TEXT(B10,"ddd")
9// 10行目以下の行は、オートフィルで10行目からコピペ
10function colorDate() {
11 // データ範囲
12 const dataRange = 'A10:ZZ100';
13 // 日付の列
14 const dateColumn = 2;
15 const dateColumnName = 'B';
16 // 背景色
17 const weekendColor = 'lightgray';
18 const holidayColor = 'aquamarine';
19
20 // 記入されている日付の範囲内の祝日リストを取得する
21 const sheet = SpreadsheetApp.getActiveSheet();
22 const values = sheet.getDataRange().getValues();
23 const firstDate = values.find(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn -1];
24 const lastDate = values.findLast(v => !isNaN(new Date(v[dateColumn - 1]).getDate()))[dateColumn - 1];
25 const holidays = CalendarApp
26 .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
27 .getEvents(firstDate, lastDate)
28 .filter(v => v.getDescription() === '祝日')
29 .map(v => v.getStartTime().getTime());
30
31 // 土日と祝日の範囲名を取得する
32 const weekendsRangeNames = values
33 .map((v, i) => new Date(v[dateColumn -1]).getDay() % 6 == 0 ? i + 1 : 0)
34 .filter(v => v > 0)
35 .map(v => v + ':' + v);
36 const holidaysRangeNames = values
37 .map((v, i) => holidays.includes(new Date(v[dateColumn - 1]).getTime()) ? i + 1 : 0)
38 .filter(v => v > 0)
39 .map(v => dateColumnName + v);
40
41 // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色)
42 sheet.getRange(dataRange).setBackground(null);
43 sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor);
44 sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor);
45}
B列を日付データ、A列とC列を計算式にしても画面表示は同じようにできます
三つとも一緒に実行する例です
先のと手法を変えてみました参考になれば…
JavaScript
1// 土日の行と祝日のセルの背景色を指定の色にする
2// 毎月の1日の行の上に枠線(太罫線)を引く
3// ------------------------------
4// 祝日の判定と曜日の判定のためB列は2024/09/01など日付として入力する
5// 月と曜の列は値を直接入力するのではなく、B列の日付から計算式で求める
6// B10セルの値: 2024/09/01
7// B列のセルは、表示形式: 「数字」→ 「カスタム数値形式」に d を記入すると
8// 日のみの表示となる
9// A10セルの計算式: =MONTH(B10)
10// C10セルの計算式: =TEXT(B10,"ddd")
11// 10行目以下の行は、オートフィルで10行目からコピペ
12function execAllFunction() {
13 // データ範囲
14 const dataRange = 'A10:ZZ100';
15 // 日付の列
16 const dateColumn = 2;
17 const dateColumnName = 'B';
18 // 背景色
19 const weekendColor = 'lightgray';
20 const holidayColor = 'aquamarine';
21 // 枠線の初期設定
22 const borderPosition = new Map([
23 ['top', true],
24 ['left', null],
25 ['bottom', null],
26 ['right', null],
27 ['vertical', null],
28 ['horizontal', null]
29 ]).values();
30 const borderColor = 'black';
31 const borderStyle = SpreadsheetApp.BorderStyle.SOLID_THICK;
32
33 // 記入されている日付の範囲内の祝日リストを取得する
34 const sheet = SpreadsheetApp.getActiveSheet();
35 const values = sheet.getRange(1, dateColumn, sheet.getLastRow(), 1)
36 .getValues().flat();
37 const firstDate = values.find(v => !isNaN(new Date(v).getDate()));
38 const lastDate = values.findLast(v => !isNaN(new Date(v).getDate()));
39 const holidays = CalendarApp
40 .getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
41 .getEvents(firstDate, lastDate)
42 .filter(v => v.getDescription() === '祝日')
43 .map(v => v.getStartTime().getTime());
44
45 // 土日の行、祝日のセル、1日の行のセル範囲名を配列に蓄積
46 const weekendsRangeNames = [];
47 const holidaysRangeNames = [];
48 const firstDayRangeNames = [];
49 values.forEach((v, i) => {
50 const date = new Date(v);
51 // 土日と1日の行と祝日のセルの範囲名を取得する
52 if (date.getDay() % 6 === 0) {
53 weekendsRangeNames.push((i + 1) + ':' + (i + 1));
54 }
55 if (holidays.includes(date.getTime())) {
56 holidaysRangeNames.push(dateColumnName + (i + 1));
57 }
58 if (date.getDate() === 1) {
59 firstDayRangeNames.push((i + 1) + ':' + (i + 1));
60 }
61 });
62
63 // 背景色を着色(土日 → 祝日の順なので祝日が土日を上書きして着色)
64 sheet.getRange(dataRange).setBackground(null);
65 sheet.getRangeList(weekendsRangeNames).setBackground(weekendColor);
66 sheet.getRangeList(holidaysRangeNames).setBackground(holidayColor);
67
68 // 枠線を引く
69 sheet.getRangeList(firstDayRangeNames)
70 .setBorder(...borderPosition, borderColor, borderStyle);
71}