GASで条件付き書式を
コードで一括設定する方法
手動だと1シートずつ設定が必要な条件付き書式(セルの値に応じて色を変える機能)を、newConditionalFormatRule()でコード化し、複数シートへ一括適用する方法を動くコードで解説します。
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開発をご相談いただけます。