トレーニング
ラーニング パス
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
ピボットテーブルを使用すると、大量のデータを迅速に分析できます。 その力は複雑になります。 Office スクリプト API を使用すると、ニーズに合わせてピボットテーブルをカスタマイズできますが、API セットのスコープによって、作業を開始することが困難になります。 この記事では、一般的なピボットテーブル タスクを実行する方法と、重要なクラスとメソッドについて説明します。
注意
API で使用される用語のコンテキストを理解するには、まず Excel のピボットテーブル ドキュメントを参照してください。 ピボットテーブルCreateから始めて、ワークシート データを分析します。
ピボットテーブルは、Office Scripts API のピボットテーブルの中心的なオブジェクトです。
これらのリレーションシップの実際の動作を確認するには、まずサンプル ブックをダウンロードします。 そのデータは、さまざまな農場からの果物の売上を表します。 これは、この記事のすべての例のベースです。 記事全体でサンプル スクリプトを実行して、ピボットテーブルを作成して探索します。
ピボットテーブルは、既存のデータへの参照を使用して作成されます。 範囲とテーブルの両方をピボットテーブルのソースにすることができます。 また、ブックに存在する場所も必要です。 ピボットテーブルのサイズは動的であるため、変換先範囲の左上隅のみが指定されます。
次のコード スニペットは、データ範囲に基づいてピボットテーブルを作成します。 ピボットテーブルには階層がないため、データはまだグループ化されていません。
const dataSheet = workbook.getWorksheet("Data");
const pivotSheet = workbook.getWorksheet("Pivot");
const farmPivot = pivotSheet.addPivotTable(
"Farm Pivot", /* The name of the PivotTable. */
dataSheet.getUsedRange(), /* The source data range. */
pivotSheet.getRange("A1") /* The location to put the new PivotTable. */);
ピボットテーブルは階層を通じて編成されます。 これらの階層は、特定の種類の階層として追加されたときにデータをピボットするために使用されます。 階層には 4 種類あります。
ピボットテーブルには、これらの特定の階層に割り当てられたフィールドの数または数を指定できます。 ピボットテーブルには、集計された数値データを表示するために少なくとも 1 つのデータ階層が必要であり、その概要をピボットする行または列が少なくとも 1 つ必要です。 次のコード スニペットは、2 つの行階層と 2 つのデータ階層を追加します。
farmPivot.addRowHierarchy(farmPivot.getHierarchy("Farm"));
farmPivot.addRowHierarchy(farmPivot.getHierarchy("Type"));
farmPivot.addDataHierarchy(farmPivot.getHierarchy("Crates Sold at Farm"));
farmPivot.addDataHierarchy(farmPivot.getHierarchy("Crates Sold Wholesale"));
ピボットテーブルの各部分は、範囲にマップされます。 これにより、スクリプトはピボットテーブルからデータを取得し、スクリプトの後半で使用したり、 Power Automate フローで返したりできます。 これらの範囲は、 から取得した PivotLayout オブジェクトを PivotTable.getLayout()
介してアクセスされます。 次の図は、 の メソッドによって返される範囲を PivotLayout
示しています。
合計行の場所は、レイアウトに基づいています。 を使用 PivotLayout.getBodyAndTotalRange
し、列の最後の行を取得して、スクリプトのピボットテーブルからデータを使用します。
次の例では、ブック内の最初のピボットテーブルを検索し、[総計] セルの値をログに記録します (下の図では緑色で強調表示されています)。
function main(workbook: ExcelScript.Workbook) {
// Get the first PivotTable in the workbook.
const pivotTable = workbook.getPivotTables()[0];
// Get the names of each data column in the PivotTable.
const pivotColumnLabelRange = pivotTable.getLayout().getColumnLabelRange();
// Get the range displaying the pivoted data.
const pivotDataRange = pivotTable.getLayout().getBodyAndTotalRange();
// Get the range with the "grand totals" for the PivotTable columns.
const grandTotalRange = pivotDataRange.getLastRow();
// Print each of the "Grand Totals" to the console.
grandTotalRange.getValues()[0].forEach((column, columnIndex) => {
console.log(`Grand total of ${pivotColumnLabelRange.getValues()[0][columnIndex]}: ${grandTotalRange.getValues()[0][columnIndex]}`);
// Example log: "Grand total of Sum of Crates Sold Wholesale: 11000"
});
}
ピボットテーブルをフィルター処理するには、3 つの方法があります。
FilterPivotHierarchies
追加の階層を追加して、すべてのデータ行をフィルター処理します。 除外された項目を含む行は、ピボットテーブルとその概要から除外されます。 これらのフィルターは項目に基づいているため、個別の値でのみ機能します。 "分類" がサンプルのフィルター階層の場合、ユーザーはフィルターの "Organic" と "Conventional" の値を選択できます。 同様に、"クレート販売卸売" が選択されている場合、フィルター オプションは数値範囲ではなく、120 や 150 などの個々の数値になります。
FilterPivotHierarchies
は、すべての値が選択された状態で作成されます。 つまり、ユーザーがフィルター コントロールを手動で操作するか、 に属するFilterPivotHierarchy
フィールドに a PivotManualFilter
が設定されるまで、何もフィルター処理されません。
次のコード スニペットは、フィルター階層として "分類" を追加します。
farmPivot.addFilterHierarchy(farmPivot.getHierarchy("Classification"));
オブジェクトは PivotFilters
、1 つのフィールドに適用されるフィルターのコレクションです。 各階層には正確に 1 つのフィールドがあるため、フィルターを適用する場合は常に の最初の PivotHierarchy.getFields()
フィールドを使用する必要があります。 フィルターの種類は 4 つあります。
通常、4 種類のフィルターのうちの 1 つだけが作成され、フィールドに適用されます。 スクリプトで互換性のないフィルターを使用しようとすると、"引数が無効であるか、または不足しているか、形式が正しくない" というテキストでエラーがスローされます。
次のコード スニペットは、2 つのフィルターを追加します。 1 つ目は、既存の "分類" フィルター階層内の項目を選択する手動フィルターです。 2 番目のフィルターは、"クレート販売卸売" が 300 未満のファームを削除します。 これにより、元のデータの個々の行ではなく、これらのファームの "合計" が除外されることに注意してください。
const classificationField = farmPivot.getFilterHierarchy("Classification").getFields()[0];
classificationField.applyFilter({
manualFilter: {
selectedItems: ["Organic"] /* The included items. */
}
});
const farmField = farmPivot.getHierarchy("Farm").getFields()[0];
farmField.applyFilter({
valueFilter: {
condition: ExcelScript.ValueFilterCondition.greaterThan, /* The relationship of the value to the comparator. */
comparator: 300, /* The value to which items are compared. */
value: "Sum of Crates Sold Wholesale" /* The name of the data hierarchy. Note the "Sum of" prefix. */
}
});
スライサーは 、ピボットテーブル (または標準テーブル) 内のデータをフィルター処理します。 これらはワークシート内の移動可能なオブジェクトであり、選択を簡単にフィルター処理できます。 スライサーは、手動フィルターと同様の方法で動作します PivotFilterHierarchy
。 の PivotField
項目は、ピボットテーブルに含めるか、ピボットテーブルから除外するように切り替えられます。
次のコード スニペットは、"Type" フィールドのスライサーを追加します。 選択した項目を "Lemon" と "Lime" に設定し、スライサーを左に 400 ピクセル移動します。
const fruitSlicer = pivotSheet.addSlicer(
farmPivot, /* The table or PivotTale to be sliced. */
farmPivot.getHierarchy("Type").getFields()[0] /* What source to use as the slicer options. */
);
fruitSlicer.selectItems(["Lemon", "Lime"]);
fruitSlicer.setLeft(400);
ピボットテーブルでこれらの設定を使用してデータを集計および表示する方法を変更します。 各データ階層のフィールドでは、パーセンテージ、標準偏差、相対比較など、さまざまな方法でデータを表示できます。
データ階層フィールドの既定の集計は合計です。 DataPivotHierarchy.setSummarizeBy
では、各行または列のデータを別の方法で結合できます。 AggregationFunction
には、使用可能なすべてのオプションが一覧表示されます。
次のコード スニペットでは、合計ではなく各項目の標準偏差を表示するように "クレート販売卸売" を変更します。
const wholesaleSales = farmPivot.getDataHierarchy("Sum of Crates Sold Wholesale");
wholesaleSales.setSummarizeBy(ExcelScript.AggregationFunction.standardDeviation);
DataPivotHierarchy.setShowAs
は、データ階層の値に計算を適用します。 既定の合計の代わりに、ピボットテーブルの他の部分に対する値またはパーセンテージを表示できます。 を ShowAsRule
使用して、データ階層の値の表示方法を設定します。
次のコード スニペットは、"ファームで販売されたクレート" の表示を変更します。 値は、フィールドの総計に対する割合として表示されます。
const farmSales = farmPivot.getDataHierarchy("Sum of Crates Sold at Farm");
const rule : ExcelScript.ShowAsRule = {
calculation: ExcelScript.ShowAsCalculation.percentOfGrandTotal
};
farmSales.setShowAs(rule);
一部のユーザーには ShowAsRule
、比較としてそのフィールドに別のフィールドまたは項目が必要です。 次のコード スニペットは、"ファームで販売されたクレート" の表示をもう一度変更します。 今度は、フィールドには、そのファーム行の "レモン" の値との各値の差が表示されます。 ファームがレモンを販売していない場合、フィールドには "#N/A" と表示されます。
const typeField = farmPivot.getRowHierarchy("Type").getFields()[0];
const farmSales = farmPivot.getDataHierarchy("Sum of Crates Sold at Farm");
const rule: ExcelScript.ShowAsRule = {
calculation: ExcelScript.ShowAsCalculation.differenceFrom,
baseField: typeField, /* The field to use for the difference. */
baseItem: typeField.getPivotItem("Lemon") /* The item within that field that is the basis of comparison for the difference. */
};
farmSales.setShowAs(rule);
farmSales.setName("Difference from Lemons of Crates Sold at Farm");
Office Scripts に関するフィードバック
Office Scripts はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。
トレーニング
ラーニング パス
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization