В API VBA / C # для Excel доступно свойство Range.PivotField . Есть ли эквивалент в JavaScript API или, более конкретно, я могу найти PivotField, который связан с активной ячейкой?
Я обнаружил, что в JS API есть PivotField , и эти поля содержатся в иерархиях сводных таблиц, но ссылка на диапазон отсутствует. В качестве альтернативы, если нет Range.PivotField, может ли быть «PivotField.Range», то есть я мог бы отсканировать сводные таблицы на листе и создать сопоставление полей ячеек?
Обновление
Мне удалось отобразить области сводной таблицы (строки, столбцы, тело и фильтры отдельно) следующим образом:
var ws = context.workbook.worksheets.getItem(event.worksheetId);
return context.sync().then(function () {
ws.load('pivotTables');
})
.then(context.sync)
.then(function () {
ws.pivotTables.items.forEach(function (value, index) {
value.load('layout');
value.load('name');
value.load('rowHierarchies');
value.load('columnHierarchies');
value.load('dataHierarchies');
value.load('filterHierarchies');
//value.context.sync().then(function () {
sheetPivotTables[event.worksheetId][index] = {
Layout: value.layout,
Name: value.name,
RowHierarchies: value.rowHierarchies,
ColumnHierarchies: value.columnHierarchies,
DataHierarchies: value.dataHierarchies,
FilterHierarchies: value.filterHierarchies,
RowRange: null,
ColumnRange: null,
DataRange: null,
FilterRange: null,
Range: null
};
});
})
.then(context.sync)
.then(function () {
sheetPivotTables[event.worksheetId].forEach(function (item, index) {
var rowHierarchyCount = 0;
if (item.RowHierarchies != undefined) {
// empty row hierarchy count = 0!
rowHierarchyCount = item.RowHierarchies.getCount();
}
item.RowHierarchyCount = rowHierarchyCount;
var columnHierarchyCount = 0;
if (item.ColumnHierarchies != undefined) {
// empty column hiearchy count = 1!
columnHierarchyCount = item.ColumnHierarchies.getCount();
}
item.ColumnHierarchyCount = columnHierarchyCount;
var dataHierarchyCount = 0;
if (item.DataHierarchies != undefined) {
// empty data hiearchy count = 0!
dataHierarchyCount = item.DataHierarchies.getCount();
}
item.DataHierarchyCount = dataHierarchyCount;
var filterHierarchyCount = 0;
if (item.FilterHierarchies != undefined) {
// empty filter hiearchy count = 0!
filterHierarchyCount = item.FilterHierarchies.getCount();
}
item.FilterHierarchyCount = filterHierarchyCount;
});
})
.then(context.sync)
.then(function () {
sheetPivotTables[event.worksheetId].forEach(function (item, index) {
item.Range = item.Layout.getRange();
item.Range.load('rowCount');
item.Range.load('columnCount');
item.Range.load('rowIndex');
item.Range.load('columnIndex');
if (item.RowHierarchyCount.m_value > 0) {
// empty row hierarchy count = 0!
item.RowRange = item.Layout.getRowLabelRange();
item.RowRange.load('rowCount');
item.RowRange.load('columnCount');
item.RowRange.load('rowIndex');
item.RowRange.load('columnIndex');
}
if (item.ColumnHierarchyCount.m_value > 1) {
// empty column hiearchy count = 1!
item.ColumnRange = item.Layout.getColumnLabelRange();
item.ColumnRange.load('rowCount');
item.ColumnRange.load('columnCount');
item.ColumnRange.load('rowIndex');
item.ColumnRange.load('columnIndex');
}
if (item.DataHierarchyCount.m_value > 0) {
// empty data hiearchy count = 0!
item.DataRange = item.Layout.getDataBodyRange();
item.DataRange.load('rowCount');
item.DataRange.load('columnCount');
item.DataRange.load('rowIndex');
item.DataRange.load('columnIndex');
}
if (item.FilterHierarchyCount.m_value > 0) {
// empty filter hiearchy count = 0!
item.FilterRange = item.Layout.getFilterAxisRange();
item.FilterRange.load('rowCount');
item.FilterRange.load('columnCount');
item.FilterRange.load('rowIndex');
item.FilterRange.load('columnIndex');
}
});
})
.then(context.sync);
Затем можно найти выбранную сводную таблицу и выбранный элемент данных в теле таблицы (см. getDataHierarchy ):
selectedDataItem = selectedPivotTable.layout.getDataHierarchy(selectedRange);
Оси остаются проблемой. getPivotItems должно работать здесь, но кажется, что он возвращает правильный пустой массив только тогда, когда на соответствующей оси нет элементов. В противном случае он останавливает выполнение обработчика события при ближайшем вызове context.sync()
:
...
selectedPivotItems = selectedPivotTable.layout.getPivotItems("column", selectedRange);
})
.then(context.sync)
...
Я сообщил об этом, и сейчас это открытая ошибка: https://github.com/OfficeDev/office-js/issues/569