条件付き書式のルール、誰が見てもわかりますか? — チェック設定シートで一括管理
条件付き書式あるある
データチェックでお馴染みの条件付き書式
-
見える化されて分かりやすい
-
チェック工数が大幅に減った
といったポジティブな声がある一方、
-
この色の意味何だっけ?
-
このルール、誰が作った?
-
ルールはどこ?
といったネガティブな声も聞かれます。
ルールが増えると意味不明になる
作った本人しか分からない
これは条件付き書式あるあるでは?
気づいたら、条件付き書式の管理が一番面倒になってる としたら、笑うに笑えないですね。
チェック設定シートで一括管理
GASなら、「チェック設定」シートにルールを並べるだけ。
ワンクリックで一括チェック + 問題セルのハイライト が可能です。
ポイントは、チェックルールがシート上に常に一覧で見えている こと。
設定画面を開かなくても、どの列に・どんな条件をかけているか が誰でもすぐにわかること。
ルールの追加や変更もセルを書き変えるだけ。
引き継ぎはシートを見せるだけで完了します。
コード.gs
空欄・最小値・最大値をチェックするスクリプト
// コード.gs
/**
* 空欄・異常値をチェックしてハイライト表示する
* 「チェック設定」シートにルールを定義 → 対象シートを一括チェック
*/
function checkData() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ui = SpreadsheetApp.getUi();
// ── チェック設定の読み込み ──
const settingSheet = ss.getSheetByName('チェック設定');
if (!settingSheet) {
ui.alert('「チェック設定」シートが見つかりません。\n先に作成してください。');
return;
}
const settingData = settingSheet.getDataRange().getValues();
const rules = [];
for (let i = 1; i < settingData.length; i++) {
const colName = String(settingData[i][0]).trim();
const ruleType = String(settingData[i][1]).trim();
const ruleValue = settingData[i][2];
if (colName === '' || ruleType === '') continue;
rules.push({ colName: colName, ruleType: ruleType, ruleValue: ruleValue });
}
if (rules.length === 0) {
ui.alert('チェック設定にルールが登録されていません。');
return;
}
// ── 対象シートの取得 ──
const targetSheet = ss.getActiveSheet();
if (targetSheet.getName() === 'チェック設定') {
ui.alert('チェック設定シート自体はチェック対象外です。\nチェックしたいシートを選択してから実行してください。');
return;
}
const data = targetSheet.getDataRange().getValues();
if (data.length < 2) {
ui.alert('データがありません(ヘッダー行のみ、またはシートが空です)。');
return;
}
// ── ヘッダーから列番号を特定 ──
const headers = data[0].map(function(h) { return String(h).trim(); });
// ── 背景色を初期化(前回のハイライトをリセット) ──
const dataRange = targetSheet.getRange(2, 1, data.length - 1, headers.length);
const backgrounds = [];
for (let i = 0; i < data.length - 1; i++) {
const row = [];
for (let j = 0; j < headers.length; j++) {
row.push('#ffffff');
}
backgrounds.push(row);
}
let errorCount = 0;
// ── ルールごとにチェック ──
for (let r = 0; r < rules.length; r++) {
const colIndex = headers.indexOf(rules[r].colName);
if (colIndex === -1) continue;
for (let row = 1; row < data.length; row++) {
const cellValue = data[row][colIndex];
let hasError = false;
if (rules[r].ruleType === '必須') {
if (cellValue === '' || cellValue === null || cellValue === undefined) {
hasError = true;
}
} else if (rules[r].ruleType === '最小値') {
if (cellValue !== '' && typeof cellValue === 'number' && cellValue < Number(rules[r].ruleValue)) {
hasError = true;
}
} else if (rules[r].ruleType === '最大値') {
if (cellValue !== '' && typeof cellValue === 'number' && cellValue > Number(rules[r].ruleValue)) {
hasError = true;
}
}
if (hasError) {
backgrounds[row - 1][colIndex] = '#ffcccc';
errorCount++;
}
}
}
// ── 結果を反映 ──
dataRange.setBackgrounds(backgrounds);
if (errorCount === 0) {
ui.alert('チェック完了\n\n問題は見つかりませんでした。');
} else {
ui.alert('チェック完了\n\n' + errorCount + ' 件の問題が見つかりました。\n赤いセルを確認してください。');
}
}
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('自動ボタン')
.addItem('データチェック実行', 'checkData')
.addToUi();
}使い方
① 新規または既存のスプレッドシートを用意
チェックしたいデータがあるスプレッドシートを開きます。
新しいスプレッドシートで試してから本番に導入するのがおすすめです。
② 「チェック設定」シートを作成
シートを1枚追加し、シート名を「チェック設定」にします。
A列に「列名」、B列に「ルール」、C列に「値」を記入してください。
※ これは一例です。自社のデータに合わせて、A列の列名とC列の値を変更してください。
※ B列のルール名は変更できません。
※ D列の「意味」は無くても作動しますが、あると親切です。
※ 同じ列に複数のルールを設定できます(例:数量に「必須」と「最小値」の両方)。
※ 新しいスプレッドシートを用意した場合は、画像「条件付き書式の例」のようなシートも作る必要があります。
③ 拡張機能 → Apps Script にコードを貼り付けて保存
④ スプレッドシートをリロード
メニューバーに「自動ボタン」が追加されます。
⑤ チェックしたいシートを開いた状態で「自動ボタン」→「データチェック実行」
初めて実行すると承認ダイアログが表示されます。承認手順は第1回と同じです。
⑥ 結果確認
問題のあるセルが赤くハイライトされ、件数がポップアップで表示されます。修正後に再実行すると前回のハイライトはリセットされます。
ワンポイント・レッスン
getRange(行, 列, 行数, 列数) ― シートの「ここからここまで」を指定する
コードの中にあるこの部分を見てください。
const dataRange = targetSheet.getRange(2, 1, data.length - 1, headers.length);第1回では `getDataRange()` を使いました。これは「データがある全範囲を自動検出」する便利なメソッドですが、範囲を細かく指定したいときには使えません。
今回はヘッダー行(1行目)を除いたデータ部分だけに背景色を設定したいので、`getRange()` で範囲を自分で指定しています。
getRange( 2, 1, data.length - 1, headers.length )
↑ ↑ ↑ ↑
開始行(2行目) 開始列(A列) 行数(全行−ヘッダー) 列数-
開始行 `2` — 1行目はヘッダーなので、2行目から
-
開始列 `1` — A列から(GASでは列番号は1始まり)
-
行数 `data.length – 1` — 全行からヘッダー1行を引いた数
-
列数 `headers.length` — ヘッダーの数 = 列の数
`getDataRange()` は「全体をまるごと取得」、`getRange()` は「ここからここまで」を自分で指定。この使い分けができると、ヘッダーを除外したり、特定の列だけを処理したりと、やれることの幅が広がります。
まとめ
-
チェック設定シートにルールを並べてワンクリック実行するだけで、空欄や異常値のあるセルが赤くハイライトされ、件数もポップアップで確認できる。
-
条件付き書式と違い、どんなチェックがかかっているかはシートを開くだけで一目瞭然。この色の意味何だっけ?ルールはどこ?がなくなる。
-
ルールの追加・変更もセルを書き変えるだけ。簡単、分かりやすい!
拡張コードで 重複・リスト・計算もチェック。さらにルールのON/OFF、エラー一覧シートで作業効率UP
3つの拡張ルール
-
注文No「A-003」が2行ある — 指定列の値が重複していないかチェック
-
担当者に「たなか」「ヤマモト」とある — 入力値があらかじめ決めた選択肢リストに含まれるかチェック
-
金額が31,000円だが、数量200×単価150=30,000円のはず — 列同士の掛け算の結果と一致するかチェック
ルールをON/OFF
チェック設定シートのルールを ON/OFF 切り替え可能に。ルールを削除せずに一時停止できます。
エラー一覧シートを自動作成
このシートを見れば、「なぜ赤いのか」が一目でわかる!
この記事の続きはnoteで公開しています。
