カスタム数式での条件付き書式を追加するスクリプトをお示しします。
カスタム数式の条件付き書式の設定方法は、
javascript
1const rule = SpreadsheetApp.newConditionalFormatRule()
2 .whenFormulaSatisfied('=($F1<>"")')
3 .setBackground('#FFFFFF')//背景色に白を指定
4 .setRanges([range])
5 .build();
になります。
以下にお示しするのは、シートの数が1000を超えるとなると、実行中にタイムアウトなどのエラーが発生することも考えられるので、条件付き書式が追加されないシートが残ってしまうことを考慮したスクリプトです。
実行画面で追加するシートの開始位置(左端を0としたときのシートの順番)を指定するようにしてあります。
削除やシート探索のスクリプトを追加し、、メニュー表示も修正しました。
javascript
1function set_conditional_format_all_sheets() {
2 // UIを取得
3 const ui = SpreadsheetApp.getUi();
4 // 現在開いているスプレッドシートを取得
5 const ss = SpreadsheetApp.getActiveSpreadsheet();
6 // スプレッドシートに存在するすべてのシートを取得
7 const sheets = ss.getSheets();
8 // 条件付き書式を追加するシートの選択を求める
9 const input = ui.prompt('確認', '条件付き書式を追加します。\n' +
10 'シートの位置を入力してください。\n' +
11 '何も入力がないと最初のシートから追加します。', ui.ButtonSet.OK_CANCEL);
12 // キャンセルが押されたらスクリプトを終了する
13 if (input.getSelectedButton() == ui.Button.CANCEL) {
14 return;
15 }
16 // 開始位置を取り出す
17 const position = input.getResponseText() == '' ? 0 : input.getResponseText();
18 // 1シートずつ条件付き書式をセットしていく
19 for (let i = position; i < sheets.length; i++) {
20 const lastRow = sheets[i].getLastRow();
21 if (lastRow > 0) {
22 // 条件付き書式をセットするのはシート内で現在使われている範囲
23 const range = sheets[i].getRange(1, 1, lastRow, sheets[i].getLastColumn());
24 // 条件付き書式のセット
25 const rule = SpreadsheetApp.newConditionalFormatRule()
26 .whenFormulaSatisfied('=($G1<>"")')//←Gに修正
27 .setBackground('#FFFFFF')//背景色に白を指定
28 .setRanges([range])
29 .build();
30 // 既存の条件付き書式のルールを取得する
31 const rules = sheets[i].getConditionalFormatRules();
32 // 既存のルールに今回作成したルールを追加
33 rules.push(rule);
34 // 既存と新規のルールを合わせてシートにセットする
35 sheets[i].setConditionalFormatRules(rules);
36 }
37 }
38}
39//条件付き書式を処理
40function handleConditionalFormatRulesOfSheets(mode) {
41 const ss = SpreadsheetApp.getActiveSpreadsheet();
42 const sheets = ss.getSheets();
43 // シートの開始位置を入力
44 const ui = SpreadsheetApp.getUi()
45 const input = ui.prompt('確認', '条件付き書式の処理を実行します。\n' +
46 'シートの位置を数字で入力してください。\n' +
47 '入力がないと最初のシートから実行します。', ui.ButtonSet.OK_CANCEL);
48 // キャンセルが押されたらスクリプトを終了する
49 if (input.getSelectedButton() == ui.Button.CANCEL) {
50 return;
51 }
52 // 開始位置を取り出す
53 const position = input.getResponseText() == '' ? 0 : input.getResponseText();
54 // 指示に応じた処理を実施
55 let isMatch = false;//探しているシートがあったかどうか
56 for (let i = position; i < sheets.length; i++) {
57 const rules = sheets[i].getConditionalFormatRules();
58 if (mode == 'clear') {
59 if (rules.length > 0) {//書式があるなら全て削除
60 sheets[i].clearConditionalFormatRules();
61 }
62 } else if (mode == 'find'){//書式がないシートを探す
63 //次の行の()内の条件を変更すると探すシートを変更できる
64 if (rules.length <= 0) {
65 ui.alert('シートの開始位置は、' + i + ' です。');
66 isMatch = true;
67 break;
68 }
69 } else if (mode == 'shift' || mode == 'pop') {//一つを削除するときは残りを再設定
70 if (mode == 'shift') {
71 rules.shift();//最初の一つを削除する。
72 } else if (mode == 'pop') {
73 rules.pop();//最後の一つを削除する。
74 }
75 sheets[i].setConditionalFormatRules(rules);
76 }
77 }
78 if (mode == 'find' && !isMatch) {
79 ui.alert('シートはみつかりませんでした。');
80 }
81}
82//条件付き書式のないシートを探す
83function findConditionalFormatRulelessSheet() {
84 handleConditionalFormatRulesOfSheets('find');
85}
86//最初を削除
87function shiftConditionalFormatRuleOfSheets() {
88 handleConditionalFormatRulesOfSheets('shift');
89}
90//最後を削除
91function popConditionalFormatRuleOfSheets() {
92 handleConditionalFormatRulesOfSheets('pop');
93}
94//全て削除
95function clearConditionalFormatRulesOfSheets() {
96 handleConditionalFormatRulesOfSheets('clear');
97}
98//メニューの表示
99function onOpen() {
100 // UIの取得
101 const ui = SpreadsheetApp.getUi()
102 // メニューを作成
103 ui.createMenu('スクリプト実行')
104 .addItem('全シートに条件付き書式を追加する', 'set_conditional_format_all_sheets')
105 .addItem('条件付き書式がないシートを探す', 'findConditionalFormatRulelessSheet')
106 .addItem('全シートの条件付き書式から最初の一つを削除する', 'shiftConditionalFormatRuleOfSheets')
107 .addItem('全シートの条件付き書式から最後の一つを削除する', 'popConditionalFormatRuleOfSheets')
108 .addItem('全シートの条件付き書式を全て削除する', 'clearConditionalFormatRulesOfSheets')
109 .addToUi();
110}