条件付き書式 — セル値ルール・カラースケール・データバー・上位 N 件

level: intermediate / verified: 2026-10-01 / 4言語タブ対応 / English

やりたいこと

「60 より大きいセルだけ赤くする」「値の大きさをグラデーションやバーで表す」といった 条件付き書式のルールをプログラムから設定する。 あわせて、登録したルールの個数・種類・しきい値・適用範囲の読み戻しと削除を行う。

条件付き書式は ws.getFormatConditions() で取得する FormatConditions クラスで扱います。 流れは必ず次の 3 ステップです。

  1. dto の条件オブジェクト(CellValueObject など)を作り、適用範囲と書式をセットする
  2. fc.set〜Condition(priority, obj) で登録する(priority は適用順序。1 始まりでシート単位に一意)
  3. 全条件を登録し終えたら fc.apply() を呼ぶ(必須)

対象クラス

FormatConditions(主要メソッド)

条件の種類設定読み戻し条件オブジェクト
セル値(大于・小于 など)setCellValueCondition(p, obj)getCellValueCondition(p)dto.CellValueObject
セル値の範囲(between)setCellValueRangeCondition(p, obj)getCellValueRangeCondition(p)dto.CellValueRangeObject
カラースケールsetColorScaleFormatCondition(p, obj)getColorScaleFormatCondition(p)dto.ColorScaleObject
データバーsetDataBarFormatCondition(p, obj)getDataBarFormatCondition(p)dto.DataBarObject
上位 / 下位 N 件setTop10FormatCondition(p, obj)getTop10FormatCondition(p)dto.Top10Object
平均比較setAboveAverageCondition(p, obj)getAboveAverageCondition(p)dto.AboveAverageObject
アイコンセットsetIconsetFormatCondition(p, obj)getIconsetFormatCondition(p)dto.IconsetConditionObject
ユニーク値setUniqueValuesFormatCondition(p, obj)getUniqueValuesFormatCondition(p)dto.UniqueValuesObject
その他のメソッド説明
apply()条件の計算・反映。全条件設定後に必ず呼ぶ。
getConditionTypes()全ルールの一覧。{ priority: { セル範囲: 条件タイプ } } の入れ子マップ。
removeCondition(p) / removeAllCondition()ルールの個別削除 / 全削除。
getAppliedFontObject(range) など条件を満たして実際に書式が付いたセルの取得(apply() 後に使う)。

条件オブジェクトの共通メソッド

setA1C1(適用範囲) と setFont(dto.FontObject) / setPatternFill(dto.PatternFillObject) を持ちます。 色は dto.ColorObject に # なしの 6 桁 hex(例 "9C0006")を setHexColor() で設定します。

コード

実行結果:

// conditional-format.js — 条件付き書式ルールの追加・読み戻し・削除
const { nodeosbxl, enums, dto } = require("nodeosbxl");

const app = new nodeosbxl.App();
const wb = app.createWorkBook("condfmt.xlsx");
const ws = wb.openWorkSheet("Sheet1");

// 色ヘルパー: ColorObject は "#" なしの 6 桁 hex で作る
const color = (hex) => {
    const c = new dto.ColorObject();
    c.setHexColor(hex);
    return c;
};

// ---------- データ表 ----------
// B列: セル値ルール / C列: カラースケール / D列: データバー / E列: 上位3件・平均比較
["月", "セル値ルール", "カラースケール", "データバー", "上位/平均"].forEach((h, i) => {
    const col = "ABCDE"[i];
    ws.getRange(`${col}1:${col}1`).setValue(h);
});
const sales = [45, 78, 23, 91, 56, 34, 87, 12, 65, 49];
sales.forEach((v, i) => {
    ws.getRange(`A${i + 2}:A${i + 2}`).setNumberValue(i + 1);
    for (const col of ["B", "C", "D", "E"]) {
        ws.getRange(`${col}${i + 2}:${col}${i + 2}`).setNumberValue(v);
    }
});

const fc = ws.getFormatConditions();

// ---------- (1) セル値ルール: 60 より大きい → 濃い赤の太字 + 薄赤の塗りつぶし ----------
const cellVal = new dto.CellValueObject();
cellVal.setValueCondition(60, enums.XlFormatConditionOperator.FormatConditionGreater);
cellVal.setA1C1("B2:B11");
const redFont = new dto.FontObject();
redFont.setBold(true);
redFont.setColorObject(color("9C0006"));
cellVal.setFont(redFont);
const pinkFill = new dto.PatternFillObject();
pinkFill.setPattern(enums.XlPatternType.PatternSolid);
pinkFill.setCellColor(color("FFC7CE"));
cellVal.setPatternFill(pinkFill);
fc.setCellValueCondition(1, cellVal);

// ---------- (2) カラースケール: C列に 3 色のグラデーション ----------
const colorScale = new dto.ColorScaleObject();
colorScale.setA1C1("C2:C11");
colorScale.setMinimumCondition(color("F8696B"), enums.XlConditionValueType.ConditionValueTypeMinimum);
colorScale.setMediumCondition(color("FFEB84"), enums.XlConditionValueType.ConditionValueTypePercentile, 50);
colorScale.setMaximumCondition(color("63BE7B"), enums.XlConditionValueType.ConditionValueTypeMaximum);
fc.setColorScaleFormatCondition(2, colorScale);

// ---------- (3) データバー: D列 ----------
const dataBar = new dto.DataBarObject();
dataBar.setA1C1("D2:D11");
dataBar.setDataBarColor(color("638EC6"));
dataBar.setMinimumCondition(enums.XlConditionValueType.ConditionValueTypeMinimum);
dataBar.setMaximumCondition(enums.XlConditionValueType.ConditionValueTypeMaximum);
fc.setDataBarFormatCondition(3, dataBar);

// ---------- (4) 上位 3 件 + 平均より上: E列 ----------
const top3 = new dto.Top10Object();
top3.setRank(3, true);                       // true = 上位(false なら下位)
top3.setA1C1("E2:E11");
const blueFont = new dto.FontObject();
blueFont.setBold(true);
blueFont.setColorObject(color("0070C0"));
top3.setFont(blueFont);
fc.setTop10FormatCondition(4, top3);

const aboveAvg = new dto.AboveAverageObject();
aboveAvg.setAboveBelow(enums.XlAboveBelow.XlAboveAverage);
aboveAvg.setA1C1("E2:E11");
const greenFont = new dto.FontObject();
greenFont.setBold(true);
greenFont.setColorObject(color("006100"));
aboveAvg.setFont(greenFont);
fc.setAboveAverageCondition(5, aboveAvg);

fc.apply();                                  // 全条件の設定後に apply() が必須
console.log("[1] 5 件のルールを登録し apply() しました");

// ---------- ルール一覧の読み戻し ----------
const typeName = Object.fromEntries(
    Object.entries(enums.XlFormatConditionType).map(([name, val]) => [val, name]));
console.log(`[2] ルール数 = ${Object.keys(fc.getConditionTypes()).length}`);
for (const [prio, ranges] of Object.entries(fc.getConditionTypes())) {
    for (const [range, type] of Object.entries(ranges)) {
        console.log(`    priority ${prio}: ${range} → ${typeName[type]} (type=${type})`);
    }
}

// ---------- 各ルールの内容の読み戻し ----------
console.log("[3] ルール内容の読み戻し");
const g1 = fc.getCellValueCondition(1);
console.log(`    セル値  : ${g1.getA1C1()} 値=${g1.getConditionValue()}` +
    ` 演算子=${g1.getConditionOperetor()} (Greater=${enums.XlFormatConditionOperator.FormatConditionGreater})` +
    ` 文字色=${g1.getFont().getColorObject().getHexColor()} 太字=${g1.getFont().isBold()}` +
    ` 背景=${g1.getPatternFill().getCellColor().getHexColor()}`);
const g2 = fc.getColorScaleFormatCondition(2);
console.log(`    カラースケール: min=${g2.getMinimumColor().getHexColor()} (type=${g2.getMinimumValueType()})` +
    ` mid=${g2.getMediumColor().getHexColor()} (type=${g2.getMediumValueType()}, 閾値=${g2.getMediumValue()})` +
    ` max=${g2.getMaximumColor().getHexColor()} (type=${g2.getMaximumValueType()})`);
const g3 = fc.getDataBarFormatCondition(3);
console.log(`    データバー: 色=${g3.getDataBarColor().getHexColor()}` +
    ` minType=${g3.getMinimumCondition()} maxType=${g3.getMaximumCondition()}`);
const g4 = fc.getTop10FormatCondition(4);
console.log(`    上位 N 件: rank=${g4.getRank()} isTop=${g4.getTopBottom()}`);
const g5 = fc.getAboveAverageCondition(5);
console.log(`    平均比較: aboveBelow=${g5.getAboveBelow()}` +
    ` (XlAboveAverage=${enums.XlAboveBelow.XlAboveAverage})`);

// ---------- 条件を満たして書式が付いたセル(apply() 後に取得可能)----------
const byRow = (a, b) => Number(a.slice(1)) - Number(b.slice(1));
console.log("[4] 書式が適用されたセル");
console.log(`    B列 (>60)     : ${Object.keys(fc.getAppliedFontObject("B2:B11")).sort(byRow).join(" ")}`);
console.log(`    E列 (上位/平均): ${Object.keys(fc.getAppliedFontObject("E2:E11")).sort(byRow).join(" ")}`);
const appliedBar = fc.getAppliedDataBar("D2:D11");
console.log(`    D列 データバー : ${Object.values(appliedBar).filter(Boolean).length} セル`);

// ---------- 削除 ----------
fc.removeCondition(4);                       // 上位 3 件のルールだけ削除
console.log(`[5] removeCondition(4) 後のルール数 = ${Object.keys(fc.getConditionTypes()).length}`);
fc.removeAllCondition();                     // 全ルールを削除
console.log(`[6] removeAllCondition() 後のルール数 = ${Object.keys(fc.getConditionTypes()).length}`);

// セル値ルールを登録し直して保存(保存ファイルを開いたとき効果が見えるように)
fc.setCellValueCondition(1, cellVal);
fc.apply();

wb.save();
wb.close();
console.log("[done] condfmt.xlsx を保存しました(セル値ルールを再登録済み)");
[1] 5 件のルールを登録し apply() しました
[2] ルール数 = 5
    priority 1: B2:B11 → CellValue (type=1)
    priority 2: C2:C11 → ColorScale (type=3)
    priority 3: D2:D11 → Databar (type=4)
    priority 4: E2:E11 → Top10 (type=5)
    priority 5: E2:E11 → AboveAverageCondition (type=12)
[3] ルール内容の読み戻し
    セル値  : B2:B11 値=60 演算子=5 (Greater=5) 文字色=9C0006 太字=true 背景=FFC7CE
    カラースケール: min=F8696B (type=5) mid=FFEB84 (type=4, 閾値=50) max=63BE7B (type=6)
    データバー: 色=638EC6 minType=5 maxType=6
    上位 N 件: rank=3 isTop=true
    平均比較: aboveBelow=0 (XlAboveAverage=0)
[4] 書式が適用されたセル
    B列 (>60)     : B3 B5 B8 B10
    E列 (上位/平均): E3 E5 E6 E8 E10
    D列 データバー : 10 セル
[5] removeCondition(4) 後のルール数 = 4
[6] removeAllCondition() 後のルール数 = 0
[done] condfmt.xlsx を保存しました(セル値ルールを再登録済み)

B 列の B3 B5 B8 B10 は値が 78・91・87・65(= 60 より大きい)のセル、 E 列の E3 E5 E6 E8 E10 は「上位 3 件」と「平均(54.2)より上」の和集合です。 見た目の書式は検証できないため、このようにルールの個数・種類・しきい値・適用されたセルを 読み戻して出力することで、意図どおり設定できたことを確認しています。

解説

priority(適用順序)

apply() の役割

主な enum

enumよく使う値
XlFormatConditionOperatorFormatConditionGreater(5) / FormatConditionGreaterEqual(7) / FormatConditionLess(6) / FormatConditionLessEqual(8) / FormatConditionEqual(3) / FormatConditionBetween(1)
XlFormatConditionTypeCellValue(1) / ColorScale(3) / Databar(4) / Top10(5) / XlIconSet(6) / UniqueValues(8) / AboveAverageCondition(12)
XlConditionValueTypeConditionValueTypeMinimum(5) / ConditionValueTypeMaximum(6) / ConditionValueTypePercentile(4) / ConditionValueTypeNumeric(1)
XlAboveBelowXlAboveAverage(0) / XlBelowAverage(2) / XlAboveStdDev(1) / XlBelowStdDev(3)

永続化

条件付き書式は wb.save() で .xlsx に保存され、app.openWorkBook() で開き直しても getConditionTypes() や各読み戻しメソッドで復元できます(実測済み)。

注意点

関連