条件付き書式のルール、誰が見てもわかりますか? — チェック設定シートで一括管理

条件付き書式あるある

条件付き書式の例

データチェックでお馴染みの条件付き書式

  • 見える化されて分かりやすい

  • チェック工数が大幅に減った

といったポジティブな声がある一方、

  • この色の意味何だっけ?

  • このルール、誰が作った?

  • ルールはどこ?

といったネガティブな声も聞かれます。

ルールが増えると意味不明になる
作った本人しか分からない
これは条件付き書式あるあるでは?

気づいたら、条件付き書式の管理が一番面倒になってる としたら、笑うに笑えないですね。

チェック設定シートで一括管理

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つの拡張ルール

  1. 注文No「A-003」が2行ある — 指定列の値が重複していないかチェック

  2. 担当者に「たなか」「ヤマモト」とある — 入力値があらかじめ決めた選択肢リストに含まれるかチェック

  3. 金額が31,000円だが、数量200×単価150=30,000円のはず — 列同士の掛け算の結果と一致するかチェック

ルールをON/OFF

チェック設定シートの拡張

チェック設定シートのルールを ON/OFF 切り替え可能に。ルールを削除せずに一時停止できます。

エラー一覧シートを自動作成

エラー一覧シート

このシートを見れば、「なぜ赤いのか」が一目でわかる

この記事の続きはnoteで公開しています。

noteで続きを読む

GAS,自動化自動化

Posted by botw