ピボットテーブルを操作したい(PivotTable

スプレッドシートのデータを整理するとき、ピボットテーブルはとても便利です。

  1. データを選択する

  2. [挿入][ピボットテーブル]

  3. [挿入先]を選択

    • 新しいシート

    • 既存のシート → 挿入先のセルを選択

  4. 「行」を追加

  5. 「列」を追加

  6. 「値」を追加

  7. 「フィルタ」を追加

データを多角的に確認したい場合は、同じデータに対して、 複数のピボットテーブルを作成することもあります。

ピボットテーブルを作成したい(createPivotTable

 1// ピボットテーブルに使用する範囲
 2const readRange = readSheet.getRange("A1:D10");
 3
 4// ピボットテーブルを出力するセルを選択
 5const pivotRange = writeSheet.getRange("A1");
 6
 7// (空の)ピボットテーブルを作成
 8const pivotTable = pivotRange.createPivotTable(readRange);
 9
10// 行グループを追加(1列目)
11pivotTable.addRowGroup(1);
12
13// 列グループを追加(2列目)
14pivotTable.addColumnGroup(2);
15
16// ピボット値を追加(3列目をCOUNTAで集計)
17const method = SpreadsheetApp.PivotTableSummarizeFunction.COUNTA;
18pivotTable.addPivotValue(3, method);
19
20// フィルターを追加(4列目が空でない行のみ表示)
21const criteria = SpreadsheetApp.newFilterCriteria().whenCellNotEmpty().build();
22pivotTable.addFilter(4, criteria);

createPivotTableメソッドで、ピボットテーブルを作成できます。 作成するときに、使用するデータの範囲ピボットテーブルを出力するセルRangeオブジェクトの指定が必要です。

注釈

ピボットテーブルは、利用するデータ範囲と同じシートに作成できます。 そのときは、選択したデータ範囲と重ならないようにする必要があります。

1const readRange = readSheet.getRange("A1:D10");
2
3// 行方向に作成する場合
4const lastRow = readSheet.getLastRow();
5const pivotRange = readSheet.getRange(lastRow + 2, 1);
6
7// 列方向に作成する場合
8const lastCol = readSheet.getLastColumn();
9const pivotRange = readSheet.getRange(1, lastCol + 2);

Sheet.getLastRowSheet.getLastColumnを使って、 出力範囲の選択を自動化できます。

行や列を追加したい(addRowGroup / addColumnGroup

1const rowGroup = pivotTable.addRowGroup(1);
2const colGroup = pivotTable.addColumnGroup(2);

PivotTable.addRowGroupで行グループ、 PivotTable.addColumnGroupで列グループを追加できます。

引数には対象カラムの列番号(1はじまり)を渡します。 ひとつのPivotTableに対して複数の行グループ/列グループを追加できます。

返り値はPivotGroupオブジェクトが新規作成されます。 このオブジェクトに対してソートしたり、総計を表示したり、設定できます。

ピボット値を追加したい(addPivotValue

1const headers = ["カラム1", "カラム2", "カラム3", "カラム4"];
2const col = "カラム2";
3const index = headers.indexOf(col) + 1;
4const method = SpreadsheetApp.PivotTableSummarizeFunction.COUNTA;
5pivotTable.addPivotValue(index, method);

フィルターを追加したい(addFilter

1const headers = ["カラム1", "カラム2", "カラム3", "カラム4"];
2const col = "カラム3";
3const index = headers.indexOf(col) + 1;
4const criteria = SpreadsheetApp.newFilterCriteria().whenCellNotEmpty().build();
5pivotTable.addFilter(index, criteria);

addFilterでフィルターを追加できます。 フィルター条件はフィルターを操作したい(FilterCriteria)を参考にFilterCriteriaオブジェクトを作成します。

行グループ/列グループの表示順や名前を変更したい(PivotGroup

 1const rowGroup = pivotTable.addRowGroup(1);
 2
 3// 降順に並び替え
 4rowGroup.sortDescending();
 5
 6// 表内に合計値を表示
 7rowGroup.showTotals(true);
 8
 9// 表示名を変更
10rowGroup.setDisplayName("集計項目");

addRowGroup / addColumnGroupが返すPivotGroupオブジェクトを操作して、 表示順や合計表示、表示名などを設定できます。

日時を集計したい(PivotGroup.setDateTimeGroupingRule

 1const headers = ["タイムスタンプ", "カラム2", "カラム3"];
 2const index = headers.indexOf("タイムスタンプ") + 1;
 3
 4const pivotRow = pivotTable.addRowGroup(index);
 5const byHour = SpreadsheetApp.DateTimeGroupingRuleType.HOUR;
 6pivotRow.setDateTimeGroupingRule(byHour);
 7pivotRow.setDisplayName("時刻");
 8
 9const pivotCol = pivotTable.addColumnGroup(index);
10const byDay = SpreadsheetApp.DateTimeGroupingRuleType.DAY_OF_WEEK;
11pivotCol.setDateTimeGroupingRule(byDay);
12pivotCol.setDisplayName("曜日");
13
14const method = SpreadsheetApp.PivotTableSummarizeFunction.COUNTA;
15const pivotVal = pivotTable.addPivotValue(index, method);

PivotGroup.setDateTimeGroupingRuleで日時データをグルーピングできます。 設定値はSpreadsheetApp.DateTimeGroupingRuleTypeの中で定義されている値から選択します。

注釈

日時でないカラムを渡してもエラーはでません。

ヒストグラムにしたい(PivotGroup.setHistogramGroupingRule

1// 3列目の値を、0〜100の範囲で10刻みのビンに分ける
2const pivotRow = pivotTable.addRowGroup(3);
3pivotRow.setHistogramGroupingRule(0, 100, 10);

PivotGroup.setHistogramGroupingRuleで行グループ/列グループを、任意のビン数でヒストグラム(度数分布)にできます。 行/列に指定したカラムの値が連続値の場合にとても便利です。

リファレンス