GASで条件付き書式を
コードで一括設定する方法

手動だと1シートずつ設定が必要な条件付き書式(セルの値に応じて色を変える機能)を、newConditionalFormatRule()でコード化し、複数シートへ一括適用する方法を動くコードで解説します。

|対象: GAS / スプレッドシート / 条件付き書式

Table of Contents

条件付き書式をコード化するメリット

条件付き書式は、セルの値に応じて背景色や文字色を自動で変える機能です。 手動でも設定できますが、GAS(Google Apps Script/スプレッドシートを操作できるプログラム)でコード化すると、次のような利点があります。

複数シートへ一括適用

同じルールを何十枚ものシートへループで一度に設定できる

設定がコードに残る

どんな条件・色を使ったかがコードで管理でき、再現・修正がしやすい

テンプレート配布に強い

担当者ごとのシートに同じ書式を揃え、見た目のばらつきを防げる

他の自動化と連動できる

データ取り込みやトリガー処理の最後にまとめて書式を整えられる

基本:1つのルールを追加する

まずは基本形です。ルールはnewConditionalFormatRule()で作り、条件・書式・対象範囲を指定してbuild()します。作ったルールはsetConditionalFormatRules()でシートに書き戻します。既存ルールを消したくないので、いったん取得してから追加するのがコツです。

function addBasicRule() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
  // C2:C1000 の「金額」列を対象にする
  const range = sheet.getRange("C2:C1000");

  // 10万円以上のセルを赤系の背景にするルール
  const rule = SpreadsheetApp.newConditionalFormatRule()
    .whenNumberGreaterThanOrEqualTo(100000)
    .setBackground("#FCE4E4") // 薄い赤
    .setFontColor("#B71C1C")  // 濃い赤の文字
    .setBold(true)
    .setRanges([range])
    .build();

  // 既存ルールを取得して追加(既存を消さない)
  const rules = sheet.getConditionalFormatRules();
  rules.push(rule);
  sheet.setConditionalFormatRules(rules);
}

色は"#RRGGBB"形式の16進数で指定します。setBackground()が背景色、setFontColor()が文字色、setBold(true)で太字にできます。

数値のしきい値で3段階に色分けする

在庫数や達成率のように、数値の大小で「危険・注意・安全」を色分けしたいケースは多いはずです。whenNumberEqualTo()whenNumberBetween()whenNumberGreaterThanOrEqualTo()を組み合わせて複数ルールを作ります。

function addThresholdRules() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("在庫");
  const range = sheet.getRange("D2:D1000"); // 在庫数の列

  // しきい値と色の定義(上から順に評価される)
  const rules = [
    // 0 = 欠品(赤)
    SpreadsheetApp.newConditionalFormatRule()
      .whenNumberEqualTo(0)
      .setBackground("#F8BBBB")
      .setRanges([range])
      .build(),
    // 1〜9 = 残りわずか(黄)
    SpreadsheetApp.newConditionalFormatRule()
      .whenNumberBetween(1, 9)
      .setBackground("#FFF3C4")
      .setRanges([range])
      .build(),
    // 10以上 = 十分(緑)
    SpreadsheetApp.newConditionalFormatRule()
      .whenNumberGreaterThanOrEqualTo(10)
      .setBackground("#D7EFD9")
      .setRanges([range])
      .build(),
  ];

  // このシートのルールをまとめて置き換える
  sheet.setConditionalFormatRules(rules);
}

条件付き書式は配列の先頭から順に評価され、最初に一致したルールが優先されます。 範囲が重なる場合は「厳しい条件を先に、ゆるい条件を後に」並べると意図どおりの色になります。

テキスト一致・空欄でセルを色付けする

ステータス列の「完了」をグレーにしたり、未入力の空欄を目立たせたりするには、テキスト系の条件を使います。whenTextContains()は部分一致、whenTextEqualTo()は完全一致、whenCellEmpty()は空欄を判定します。

function addTextRule() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("タスク");
  const range = sheet.getRange("E2:E1000"); // ステータス列

  // 「完了」を含むセルをグレーアウトする
  const done = SpreadsheetApp.newConditionalFormatRule()
    .whenTextContains("完了")
    .setBackground("#EFEFEF")
    .setFontColor("#9E9E9E")
    .setRanges([range])
    .build();

  // 空欄(未入力)を薄い黄色で目立たせる
  const empty = SpreadsheetApp.newConditionalFormatRule()
    .whenCellEmpty()
    .setBackground("#FFFDE7")
    .setRanges([range])
    .build();

  const rules = sheet.getConditionalFormatRules();
  rules.push(done, empty);
  sheet.setConditionalFormatRules(rules);
}

数式ルールで行全体を色付けする

「納期を過ぎていて未完了の行」のように、あるセルの値をもとに行全体を色付けしたい場合は、whenFormulaSatisfied()で数式ルールを使います。ポイントは、数式内の列を$D2のように「列だけ絶対参照($付き)・行は相対参照」にすることです。こうすると各行が自分の列を見て判定します。

function highlightRowsByFormula() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("受注");
  const lastRow = sheet.getLastRow();
  // A〜F列の2行目以降を対象(行全体を色付けするため広めに指定)
  const range = sheet.getRange(2, 1, lastRow - 1, 6);

  // D列(納期)が今日より前で、かつF列(ステータス)が「完了」でない行を赤くする
  // 列だけ $ で固定し、行は相対参照にするのがポイント
  const rule = SpreadsheetApp.newConditionalFormatRule()
    .whenFormulaSatisfied('=AND($D2<TODAY(), $F2<>"完了")')
    .setBackground("#FDECEA")
    .setRanges([range])
    .build();

  const rules = sheet.getConditionalFormatRules();
  rules.push(rule);
  sheet.setConditionalFormatRules(rules);
}

数式は対象範囲の左上セル(この例では2行目)を基準に書きます。TODAY()AND()などスプレッドシートの関数がそのまま使えます。

カラースケール(グラデーション)を設定する

数値の大小を「色の濃淡」で表したいときはカラースケールが便利です。setGradientMinpoint()で最小値の色、setGradientMaxpoint()で最大値の色、setGradientMidpointWithValue()で中間色を指定します。

function addColorScale() {
  const sheet = SpreadsheetApp.getActive().getSheetByName("売上");
  const range = sheet.getRange("C2:C1000"); // 金額の列

  // 最小=白, 中央(50パーセンタイル)=黄, 最大=緑 の3色グラデーション
  const rule = SpreadsheetApp.newConditionalFormatRule()
    .setGradientMinpoint("#FFFFFF")
    .setGradientMidpointWithValue(
      "#FFE082",
      SpreadsheetApp.InterpolationType.PERCENTILE,
      "50"
    )
    .setGradientMaxpoint("#66BB6A")
    .setRanges([range])
    .build();

  const rules = sheet.getConditionalFormatRules();
  rules.push(rule);
  sheet.setConditionalFormatRules(rules);
}

中間点のInterpolationType.PERCENTILEは「50パーセンタイル(中央値)を基準に色を割り当てる」という指定です。NUMBERにすると具体的な数値を境目にできます。

複数シートに一括適用・洗い替えする

コード化の一番の強みは、複数シートへの一括適用です。getSheets()で全シートを回し、名前で対象を絞りながら同じルールを設定できます。setConditionalFormatRules()に新しいルールだけを渡せば、既存ルールを消して丸ごと入れ替える「洗い替え」になります。

// 複数シートに同じルールをまとめて適用し直す例
function applyStatusRuleToAllSheets() {
  const ss = SpreadsheetApp.getActive();

  ss.getSheets().forEach((sheet) => {
    // 「作業_」で始まる名前のシートだけ対象にする
    if (!sheet.getName().startsWith("作業_")) return;

    const lastRow = Math.max(sheet.getLastRow(), 2);
    const range = sheet.getRange(2, 5, lastRow - 1, 1); // E列=ステータス

    const rule = SpreadsheetApp.newConditionalFormatRule()
      .whenTextEqualTo("要対応")
      .setBackground("#FCE4E4")
      .setBold(true)
      .setRanges([range])
      .build();

    // 既存の条件付き書式を一度クリアしてから適用(洗い替え)
    sheet.setConditionalFormatRules([rule]);
  });
}

このパターンは、フォーマットを何度も微調整したいテンプレート運用で特に効果的です。 ルールをコード側で一元管理し、実行するたびに全シートの書式を最新の定義へ揃えられます。

実務での注意点

1. setで既存ルールが消えることを理解する

setConditionalFormatRules()は渡した配列で丸ごと置き換えます。手動で設定済みのルールを残したい場合は、必ずgetConditionalFormatRules()で取得してからpush()で追加してください。

2. ルールの順番=優先順位

範囲が重なるルールは、配列の先頭にあるものが優先されます。意図どおりに色が付かないときは、まずルールの並び順を疑いましょう。

3. ルールの多用は動作を重くする

1シートに大量のルールを設定すると、スプレッドシートの表示や再計算が重くなります。似た条件はまとめ、対象範囲も必要な行数だけに絞るのが安全です。

4. 数式ルールは基準セルに注意

whenFormulaSatisfied()の数式は、対象範囲の左上セルを基準に相対的に適用されます。範囲の開始行と数式内の行番号を合わせないと、1行ずれた判定になるので注意が必要です。

まとめ

GASの条件付き書式は、newConditionalFormatRule()で条件と書式を組み立て、setConditionalFormatRules()でシートに反映するのが基本の流れです。 数値しきい値・テキスト一致・数式ルール・カラースケールを使い分ければ、実務で必要な色分けはほぼ再現できます。 複数シートへの一括適用と洗い替えを組み合わせれば、テンプレートの書式を常に最新の定義へ揃え続けられます。

よくある質問

手動設定は1シートずつ・マウス操作で行うため、シートが増えたりルールを微調整するたびに手間がかかります。GASでコード化すると、同じルールを複数シートへ一括適用でき、設定内容がコードとして残るので再現性が高まります。テンプレートを配布して各担当者のシートに同じ書式を揃えたい場合にも有効です。

消えます。setConditionalFormatRules(rules)は渡した配列でシートのルールを丸ごと置き換えます。既存ルールを残したい場合は、先にgetConditionalFormatRules()で現在のルール配列を取得し、そこへpush()で追加してから設定し直してください。

whenFormulaSatisfied()で数式ルールを作り、setRanges()に行全体の範囲を渡します。数式内の列は「$D2」のように列だけを絶対参照($付き)にし、行は相対参照にするのがポイントです。こうすると各行が自分のD列を見て判定するようになります。

できます。setGradientMinpoint()・setGradientMidpointWithValue()・setGradientMaxpoint()を使うとカラースケール(3色グラデーション)を設定できます。売上や在庫数など、大小の傾向を一目で把握したい数値列に向いています。

sheet.setConditionalFormatRules([])のように空配列を渡すと、そのシートの条件付き書式ルールをすべて削除できます。ルールを組み直す前のリセットや、テンプレート再適用の前処理として使えます。

GAS開発・業務Webシステムを
相談する。

条件付き書式の一括設定以外にも、フォーム連携・帳票出力・Gmail自動化など、日々の業務を自動化するGAS開発をご相談いただけます。

GAS Webシステム開発を見る