オートフィルターと並べ替え — 条件フィルター・ソート・条件の読み戻し

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

やりたいこと

データ表にオートフィルターを設定して条件に合う行だけを表示し、 あわせて Sort で並べ替え(昇順 / 降順)を行う。 フィルターは「条件に合わない行を非表示にする」仕組みで、 非表示かどうかは Row.getHidden() で読み取れる。

やり方使うもの
フィルター設定・条件ws.getAutoFilter(range, firstRowAsHeader) → AutoFilter の各 set*Filter
条件の解除af.resetAllFilter()(条件のみ) / af.removeFilter()(フィルター自体を削除)
並べ替えws.getSort(range) / af.getSort() → executeSortAscending / executeSortDescending
非表示行の判定ws.getRow(r).getHidden()

対象クラス

nodeosbxl.AutoFilter — ws.getAutoFilter(A1C1, firstRowAsHeader?) で取得

メソッド説明
getAddress()対象セル範囲を返します。
setCustomFilter(op, criteria, colId?)演算子 + 条件式のフィルター。criteria に * ? のワイルドカードが使えます。
setAndCustomFilter(op1, c1, op2, c2, colId?) / setOrCustomFilter(...)2 条件の AND / OR 結合。
setTop10ValueFilter(n, colId?) / setBottom10ValueFilter(n, colId?)値の上位 / 下位 n 件。
setTop10PercentFilter(p, colId?) / setBottom10PercentFilter(p, colId?)値の上位 / 下位 p パーセント。
setAverageFilter(aboveAverage, colId?)平均以上(true)/ 平均以下(false)。
setUniqueValuesNumberFilter(vals, colId?)数値リストのいずれかと一致する行だけ表示。
setUniqueValuesStringFilter / setUniqueValuesDateTimeFilter文字列 / 日時版(注意点参照)。
setDateTimeFilter / setDateTimeGroupingFilter日付の期間・グルーピング条件。
setFontColorFilter / setCellColorFilter / setIconFilter色・アイコンによる条件。
getSort()ヘッダ行を保護した Sort を返します。
resetFilter(colId) / resetAllFilter()条件をクリアします(フィルター自体は残る)。
removeFilter()オートフィルター自体を削除し、非表示行も戻します。

op は enums.XlAutoFilterOperator:

値数値意味
Equal1同一
LessThan2未満
LessThanOrEqual3以下
NotEqual4同一でない
GreaterThanOrEqual5以上
GreaterThan6より大きい

nodeosbxl.Sort — ws.getSort(A1C1, firstRowAsHeader?) または af.getSort() で取得

メソッド説明
executeSortAscending(target, direction?, matchCase?)昇順に並べ替えます。target は範囲内の列番号(先頭列 = 1)。
executeSortDescending(target, direction?, matchCase?)降順に並べ替えます。
execute(sortFieldObject)dto.SortFieldObject(setSortOnValues(target, ascending) で条件設定)1 つで並べ替えます。
executeMultiple([...])複数条件の並べ替え(2026-10-01 修正により正常動作。注意点参照)。
getSortConditions()設定済み条件を dto.SortFieldObject 配列で読み戻します。
resetSort(target) / resetAllSort()条件をクリアします。AutoFilter / Table 経由の Sort でのみ有効。

direction は enums.XlRowCol(Rows = 1 / Columns = 2)。既定は Rows(行を並び替え)。

コード

実行結果:

// af-sort.js — オートフィルターと並べ替え
const { nodeosbxl, enums } = require("nodeosbxl");

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

// ---------- 1. データ準備(ヘッダ + 10 行)----------
const DATA = [
    ["りんご", "東京", 120, 100],
    ["みかん", "大阪", 40, 80],
    ["バナナ", "東京", 200, 150],
    ["ぶどう", "福岡", 60, 300],
    ["なし", "大阪", 90, 120],
    ["もも", "福岡", 150, 400],
    ["キウイ", "東京", 30, 90],
    ["マンゴー", "大阪", 70, 500],
    ["いちご", "福岡", 110, 350],
    ["メロン", "東京", 25, 800],
];
["商品名", "地域", "数量", "単価"].forEach((h, i) =>
    ws.getRange(`${"ABCD"[i]}1:${"ABCD"[i]}1`).setValue(h));
DATA.forEach((row, i) => {
    const r = i + 2;
    ws.getRange(`A${r}:A${r}`).setValue(row[0]);
    ws.getRange(`B${r}:B${r}`).setValue(row[1]);
    ws.getRange(`C${r}:C${r}`).setNumberValue(row[2]);
    ws.getRange(`D${r}:D${r}`).setNumberValue(row[3]);
});
console.log("[1] データ準備: A1:D11(ヘッダ + 10 行)");

// 表示用ヘルパー: 行番号 → "商品名(値)" / 非表示でない行の一覧
const text = (r, col) => ws.getRange(`${col}${r}:${col}${r}`).getValue()[`${col}${r}`];
const label = (r, col) => `${text(r, "A")}(${text(r, col)})`;
const visible = (col) => {
    const out = [];
    for (let r = 2; r <= 11; r++) if (!ws.getRow(r).getHidden()) out.push(label(r, col));
    return out.join(" ");
};
const hiddenList = () => {
    const out = [];
    for (let r = 2; r <= 11; r++) if (ws.getRow(r).getHidden()) out.push(r);
    return out.length ? out.join(",") : "なし";
};

// ---------- 2. オートフィルター設定 ----------
const af = ws.getAutoFilter("A1:D11", true);   // 先頭行はヘッダ
console.log(`[2] getAutoFilter → 範囲 = ${af.getAddress()} / 非表示行 = ${hiddenList()}`);

// ---------- 3. 条件フィルター: 数量 > 100 ----------
// colId は範囲内の列番号(A=1 … D=4)。criteria に演算子記号は含めない
af.setCustomFilter(enums.XlAutoFilterOperator.GreaterThan, "100", 3);
console.log(`[3] 数量>100 の可視行: ${visible("C")}`);
console.log(`    非表示行 = ${hiddenList()} / getValue("A2:A11") の件数 = ${Object.keys(ws.getRange("A2:A11").getValue()).length}`);
af.resetAllFilter();                            // 条件だけ解除(フィルター自体は残る)

// ---------- 4. Top-N / 値リストのフィルター ----------
af.setTop10ValueFilter(3, 3);                   // 数量の上位 3 件
console.log(`[4] 数量上位3件の可視行: ${visible("C")}`);
af.resetAllFilter();
af.setUniqueValuesNumberFilter([120, 40], 3);   // 数量が 120 または 40
console.log(`[5] 数量∈{120,40} の可視行: ${visible("C")}`);
af.resetAllFilter();
af.setUniqueValuesStringFilter(["東京", "福岡"], 2);   // 地域が 東京 または 福岡(文字列リスト)
console.log(`[6] 地域∈{東京,福岡} の可視行: ${visible("B")}`);
af.resetAllFilter();
af.setCustomFilter(enums.XlAutoFilterOperator.Equal, "大阪", 2);   // 地域 = 大阪(文字列一致)
console.log(`[7] 地域="大阪" の可視行: ${visible("B")}`);
af.resetAllFilter();

// ---------- 5. 並べ替え(単一キー)----------
// ヘッダを含まないデータ部だけを範囲にする(firstRowAsHeader 省略 = false)
ws.getSort("A2:D11").executeSortAscending(3);   // 数量(範囲内3列目)で昇順
console.log(`[8] 数量の昇順: ${visible("C")}`);

// オートフィルター経由の Sort はヘッダ行が自動的に保護される
const sort = af.getSort();
sort.executeSortDescending(4);                  // 単価(4列目)で降順
console.log(`[9] 単価の降順: ${visible("D")}`);

// ---------- 6. 並び替え条件の読み戻し ----------
const cond = sort.getSortConditions()[0];
console.log(`[10] 条件の読み戻し: 対象列 = ${cond.getTarget()} / 昇順 = ${cond.getSortAscending()}`);

// ---------- 7. オートフィルター自体の削除 ----------
af.removeFilter();
console.log(`[11] removeFilter 後: 非表示行 = ${hiddenList()}`);

wb.save();
wb.close();
[1] データ準備: A1:D11(ヘッダ + 10 行)
[2] getAutoFilter → 範囲 = A1:D11 / 非表示行 = なし
[3] 数量>100 の可視行: りんご(120) バナナ(200) もも(150) いちご(110)
    非表示行 = 3,5,6,8,9,11 / getValue("A2:A11") の件数 = 10
[4] 数量上位3件の可視行: りんご(120) バナナ(200) もも(150)
[5] 数量∈{120,40} の可視行: りんご(120) みかん(40)
[6] 地域∈{東京,福岡} の可視行: りんご(東京) バナナ(東京) ぶどう(福岡) もも(福岡) キウイ(東京) いちご(福岡) メロン(東京)
[7] 地域="大阪" の可視行: みかん(大阪) なし(大阪) マンゴー(大阪)
[8] 数量の昇順: メロン(25) キウイ(30) みかん(40) ぶどう(60) マンゴー(70) なし(90) いちご(110) りんご(120) もも(150) バナナ(200)
[9] 単価の降順: メロン(800) マンゴー(500) もも(400) いちご(350) ぶどう(300) バナナ(150) なし(120) りんご(100) キウイ(90) みかん(80)
[10] 条件の読み戻し: 対象列 = 4 / 昇順 = false
[11] removeFilter 後: 非表示行 = なし

解説

フィルター = 行の非表示

オートフィルターは条件に合わない行を非表示にするだけで、データは削除されません。

条件の書き方

並べ替え

注意点

関連