条件付き書式 — セル値ルール・カラースケール・データバー・上位 N 件
level: intermediate / verified: 2026-10-01 / 4言語タブ対応 / English
やりたいこと
「60 より大きいセルだけ赤くする」「値の大きさをグラデーションやバーで表す」といった 条件付き書式のルールをプログラムから設定する。 あわせて、登録したルールの個数・種類・しきい値・適用範囲の読み戻しと削除を行う。
条件付き書式は ws.getFormatConditions() で取得する FormatConditions クラスで扱います。 流れは必ず次の 3 ステップです。
dtoの条件オブジェクト(CellValueObjectなど)を作り、適用範囲と書式をセットするfc.set〜Condition(priority, obj)で登録する(priorityは適用順序。1 始まりでシート単位に一意)- 全条件を登録し終えたら
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(適用順序)
- ルールは
priority(1 始まりの適用順序)で管理され、シート単位で一意です。
getConditionTypes()の返却値のキーがこの priority です。 - 既存の priority に登録すると、既存ルールが後ろへずれます(実測)。
たとえば priority 1 に 2 回登録すると、先に登録したルールは priority 2 になります。 removeCondition(p)で削除すると、後ろの priority が繰り上がります。- 読み戻しメソッド(
getCellValueCondition(p)など)は priority の位置に別の種類のルールがあると例外になります。
まずgetConditionTypes()で種類を確認してから取得してください。
apply() の役割
apply()を呼ぶまで条件は評価されません。 実測では、apply()前のgetAppliedFontObject()は空{}を返し、apply()後は条件を満たすセル(例では B3 B5 B8 B10)が返りました。- ルールを追加・削除したら、その都度
apply()を呼んでください。
主な enum
| enum | よく使う値 |
|---|---|
XlFormatConditionOperator | FormatConditionGreater(5) / FormatConditionGreaterEqual(7) / FormatConditionLess(6) / FormatConditionLessEqual(8) / FormatConditionEqual(3) / FormatConditionBetween(1) |
XlFormatConditionType | CellValue(1) / ColorScale(3) / Databar(4) / Top10(5) / XlIconSet(6) / UniqueValues(8) / AboveAverageCondition(12) |
XlConditionValueType | ConditionValueTypeMinimum(5) / ConditionValueTypeMaximum(6) / ConditionValueTypePercentile(4) / ConditionValueTypeNumeric(1) |
XlAboveBelow | XlAboveAverage(0) / XlBelowAverage(2) / XlAboveStdDev(1) / XlBelowStdDev(3) |
永続化
条件付き書式は wb.save() で .xlsx に保存され、app.openWorkBook() で開き直しても getConditionTypes() や各読み戻しメソッドで復元できます(実測済み)。
注意点
apply()を忘れない。 忘れても例外にはならず、getApplied*系が空を返すだけなので 気づきにくいのが厄介です(解説参照)。- 演算子の getter 名は
getConditionOperetor()です。OperatorではなくOperetor(ライブラリ側の綴りそのまま)なので注意してください。 - データバーの読み戻しはメソッド名がカラースケールと違います。
DataBarObjectではgetMinimumCondition()/getMaximumCondition()がXlConditionValueType(評価条件の種類)を返し、しきい値はgetMinimumValue()/getMaximumValue()。
一方ColorScaleObjectでは種類がgetMinimumValueType()、色がgetMinimumColor()です。 - 色は
#なしの 6 桁 hex(例"9C0006")でsetHexColor()に渡します。 Top10Object.setRank(rank, isTop)の第2引数は「上位か下位か」の bool です (true= 上位 N 件、false= 下位 N 件)。
「Top10」という名前ですが N 件は任意です。- 条件オブジェクトには
setA1C1()で適用範囲を必ず設定します。 適用範囲は条件オブジェクト側が持ち、set〜Condition()には範囲を渡しません。 - **
getApplied*系が返すのは「条件を満たして書式が実際に付いたセル」だけ**です。
ルールの適用範囲全体ではありません。
関連
- 目次
- 前: 大量データの一括投入 / 次: ピボットテーブル
- セル値の型と表示書式 — 書式(フォント・塗りつぶし)の基本
- API リファレンス: FormatConditions / CellValueObject / ColorScaleObject / DataBarObject / Top10Object / XlFormatConditionOperator / XlConditionValueType / XlAboveBelow