ピボットテーブル — 作成・集計・集計方法変更・削除

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

やりたいこと

ワークシート上のソースデータからピボットテーブルを作成し、 行フィールド・値フィールドを配置して集計する。 あわせて集計方法の変更(合計→平均)とピボットテーブルの削除を行う。

手順メソッド
ピボットテーブルの追加ws.getPivotTables().addPivotTable(name, sourceRange, destCell)
フィールド取得pt.getField(fieldName)
フィールド配置pt.setFields(settings, layoutType, rowFields, colFields, filterFields, dataFields)
集計の実行pt.refreshData() → pt.refresh()
集計方法の変更field.setDataFieldSubTotalsMethod(...) → 再度 setFields → refreshData → refresh
ピボットの削除ws.getPivotTables().removePivotTable(name)

対象クラス

PivotTables (WorkSheet.getPivotTables() で取得)

メソッド説明
addPivotTable(name, sourceRange, destCell)ピボットテーブルを追加。sourceRange は A1 形式のセル範囲、destCell は出力先の左上セル (A1 形式)。
getPivotTable(name)名前でピボットテーブルを取得。存在しない場合は例外。
removePivotTable(name)ピボットテーブルを削除。

PivotTable

メソッド説明
getField(fieldName)ソースデータのヘッダ名でフィールドを取得 (dto.PivotFieldObject)。
getFields()全フィールドの配列を返す。
getPivotTableSetting()設定オブジェクト (dto.PivotTableSettingObject) を返す。setFields の第 1 引数に使う。
setFields(settings, layout, rows, cols, filters, data)フィールドを配置してレイアウトを確定する。
refreshData()ソースデータを再読込して集計し直す。
refresh()フィールド構成の変更を反映して再集計する。
getLayoutType()現在のレイアウト種別 (enums.XlPivotTableLayoutType) を返す。

dto.PivotFieldObject

メソッド説明
setFieldType(type)フィールドの役割を設定 (enums.XlPivotFieldType)。
setDataFieldSubTotalsMethod(method)集計方法を設定 (enums.XlPivotFieldSubtotalsMethodType)。データフィールドのみ有効。
getCaption()フィールド名を返す。

主な enum

enum値説明
XlPivotFieldType.PivotFieldTypeRow0行フィールド
XlPivotFieldType.PivotFieldTypeCol1列フィールド
XlPivotFieldType.PivotFieldTypeData3データ (値) フィールド
XlPivotTableLayoutType.TabularForm2テーブル形式
XlPivotTableLayoutType.CompactForm0コンパクト形式
XlPivotTableLayoutType.OutlineForm1アウトライン形式
XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeSum1合計
XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeAverage3平均
XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeCount2個数
XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeMax4最大
XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeMin5最小

コード

実行結果:

// pivot-sample.js — ピボットテーブル: 作成・集計・集計方法変更・削除
const { nodeosbxl, enums } = require("nodeosbxl");

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

// ---------- 1. ソースデータ ----------
// 地域 / 商品 / 数量 の 10 行
const headers = ["地域", "商品", "数量"];
const srcData = [
  ["東", "りんご", 10], ["東", "みかん", 20], ["西", "りんご", 30],
  ["西", "みかん", 15], ["東", "りんご", 25], ["北", "みかん", 40],
  ["北", "りんご",  5], ["西", "りんご", 10], ["東", "みかん", 30],
  ["北", "りんご", 20],
];
headers.forEach((h, i) => {
  const col = String.fromCharCode(65 + i);
  ws.getRange(`${col}1:${col}1`).setValue(h);
});
srcData.forEach((row, ri) => {
  row.forEach((v, ci) => {
    const col = String.fromCharCode(65 + ci);
    const r = ri + 2;
    if (typeof v === "number") ws.getRange(`${col}${r}:${col}${r}`).setNumberValue(v);
    else ws.getRange(`${col}${r}:${col}${r}`).setValue(v);
  });
});
const srcTotal = srcData.reduce((s, r) => s + r[2], 0);
console.log(`[1] ソースデータ: ${srcData.length} 行, 数量の合計 = ${srcTotal}`);

// ---------- 2. ピボットテーブル作成 (行=地域, 値=数量 合計) ----------
const pt = ws.getPivotTables().addPivotTable("売上集計", "A1:C11", "E1");

const rf = pt.getField("地域");
rf.setFieldType(enums.XlPivotFieldType.PivotFieldTypeRow);
const df = pt.getField("数量");
df.setFieldType(enums.XlPivotFieldType.PivotFieldTypeData);
df.setDataFieldSubTotalsMethod(enums.XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeSum);

pt.setFields(pt.getPivotTableSetting(), enums.XlPivotTableLayoutType.TabularForm,
             [rf], [], [], [df]);
pt.refreshData();
pt.refresh();
console.log("[2] ピボットテーブル作成 (行=地域, 値=数量 合計, レイアウト=テーブル形式)");

// ---------- 3. 集計結果の読み戻しと検算 ----------
// ピボット出力: E1=ヘッダ, E2〜=行ラベル, F2〜=値, 最終行=総計
const pivotRows = {};
for (let r = 2; r <= 10; r++) {
  const label = ws.getRange(`E${r}:E${r}`).getValue()[`E${r}`];
  const val   = ws.getRange(`F${r}:F${r}`).getValue()[`F${r}`];
  if (label !== undefined && label !== "") {
    pivotRows[label] = Number(val);
    console.log(`    ${label} = ${val}`);
  }
}
const grandTotal = pivotRows["総計"];
console.log(`[3] 検算: 総計 ${grandTotal} === ソース合計 ${srcTotal} → ${grandTotal === srcTotal ? "OK" : "NG"}`);

// ---------- 4. 集計方法を平均に変更 ----------
df.setDataFieldSubTotalsMethod(enums.XlPivotFieldSubtotalsMethodType.SubtotalsMethodTypeAverage);
pt.setFields(pt.getPivotTableSetting(), enums.XlPivotTableLayoutType.TabularForm,
             [rf], [], [], [df]);
pt.refreshData();
pt.refresh();
console.log("[4] 集計方法を合計→平均に変更");
for (let r = 2; r <= 10; r++) {
  const label = ws.getRange(`E${r}:E${r}`).getValue()[`E${r}`];
  const val   = ws.getRange(`F${r}:F${r}`).getValue()[`F${r}`];
  if (label !== undefined && label !== "") {
    console.log(`    ${label} = ${val}`);
  }
}

// ---------- 5. フィールド情報の取得 ----------
const fields = pt.getFields();
console.log(`[5] getFields: ${fields.length} 個 → ${fields.map(f => f.getCaption()).join(", ")}`);
console.log(`    getLayoutType = ${pt.getLayoutType()} (TabularForm=${enums.XlPivotTableLayoutType.TabularForm})`);

// ---------- 6. ピボットテーブルの削除 ----------
ws.getPivotTables().removePivotTable("売上集計");
try {
  ws.getPivotTables().getPivotTable("売上集計");
  console.log("[6] 削除失敗");
} catch (e) {
  console.log("[6] removePivotTable → 削除確認OK");
}

wb.save();
wb.close();
[1] ソースデータ: 10 行, 数量の合計 = 205
[2] ピボットテーブル作成 (行=地域, 値=数量 合計, レイアウト=テーブル形式)
    北 = 65
    東 = 85
    西 = 55
    総計 = 205
[3] 検算: 総計 205 === ソース合計 205 → OK
[4] 集計方法を合計→平均に変更
    北 = 21.66666667
    東 = 21.25
    西 = 18.33333333
    総計 = 20.5
[5] getFields: 3 個 → 地域, 商品, 数量
    getLayoutType = 2 (TabularForm=2)
[6] removePivotTable → 削除確認OK

解説

ピボットテーブル作成の流れ

  1. ソースデータを用意する — 1 行目にヘッダ(フィールド名)、2 行目以降にデータ。
  2. addPivotTable(name, sourceRange, destCell) — ソース範囲 (A1 形式) と出力先の左上セルを指定。

同じシート内に配置する場合は destCell にソースと重ならないセルを指定します。 別シートに配置する場合は sourceRange に Sheet1!A1:C11 のようにシート名を付けます。

  1. フィールドを取得して役割を設定 — pt.getField("ヘッダ名") でフィールドを取得し、

setFieldType() で 行 / 列 / データ / フィルターのいずれかを割り当てます。

  1. setFields() で配置 — 設定オブジェクト、レイアウト種別、各フィールド配列を渡します。

引数の順序は (settings, layoutType, rowFields, colFields, filterFields, dataFields) です。

  1. refreshData() → refresh() — ソースデータを再読込し、集計結果をシートに書き出します。

setFields() だけでは結果は反映されません。 必ず refresh() を呼んでください。

集計方法の変更

データフィールドの集計方法は setDataFieldSubTotalsMethod() で変更できます。 変更後は 再度 setFields() → refreshData() → refresh() が必要です。

enum 値数値集計方法
SubtotalsMethodTypeSum1合計 (既定)
SubtotalsMethodTypeCount2個数
SubtotalsMethodTypeAverage3平均
SubtotalsMethodTypeMax4最大
SubtotalsMethodTypeMin5最小
SubtotalsMethodTypeProduct6積
SubtotalsMethodTypeCountNums7数値の個数
SubtotalsMethodTypeStdDev8標本標準偏差
SubtotalsMethodTypeStdDevP9標準偏差
SubtotalsMethodTypeVar10標本分散
SubtotalsMethodTypeVarP11分散

行 × 列のクロス集計

列フィールドも使う場合は、setFields() の colFields に配列を渡します。

出力は行ラベル (E 列) × 列ラベル (F 列以降) のマトリクスになります。

const cf = pt.getField("商品");
cf.setFieldType(enums.XlPivotFieldType.PivotFieldTypeCol);
pt.setFields(pt.getPivotTableSetting(), enums.XlPivotTableLayoutType.TabularForm,
             [rf], [cf], [], [df]);
pt.refreshData();
pt.refresh();

集計結果の読み戻し

ピボットテーブルの出力は通常のセル値として読み取れます。 ws.getRange("F3:F3").getValue() のようにして集計値を取得し、 ソースデータの合計と比較することで検算できます。

ピボットテーブルの削除

removePivotTable(name) で削除します。削除後に getPivotTable(name) を呼ぶと例外が投げられます。

注意点

関連