Как удалить все строки в таблице с помощью скриптов Office
У меня есть таблица в электронной таблице, и я хочу удалить все существующие данные. Я использую приведенный ниже код, который работает, кроме случаев, когда таблица уже пуста.
// Get the row count
let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();
// Delete all the rows
table.deleteRowsAt(0,rowCount);
Проблема в том, что rowCount вернет 1, даже если таблица пуста. когдаdeleteRowsAt
пытается удалить строку в пустой таблице, возвращает ошибку.
В VBA мы можем использовать table.ListRows.Count
и это вернет 0, если таблица пуста.
Пример: у меня 3 строки в таблице
Если я выберу все строки и удалю их из таблицы, я получу следующее:
В этой таблице теперь нет строк, но у меня нет возможности получить этот результат. Как я уже сказал, в VBA мы будем использоватьtable.ListRows.Count
и это вернет 0, но я не могу найти эквивалент для сценариев Office.
3 ответа
ОБНОВИТЬ:
Теперь у нас есть getRowCount
API в таблице, который можно использовать для решения этого сценария. Он вернет фактические строки (не считая строки заголовка или раскрытия).
// Assuming there's a table in the workbook named Table1
let rowCount = workbook.getTable('Table1').getRowCount(); // Table1
// Assuming there's a table in the workbook
let rowCount = workbook.getTables()[0].getRowCount(); // First table
====
СТАРЫЙ ОТВЕТ
Я думаю, нам не хватает API, который будет обеспечивать подсчет строк. Мы добавим это в очередь. Обходной путь - это -
function main(workbook: ExcelScript.Workbook) {
let table = workbook.getTable("Table26");
let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();
try {
table.deleteRowsAt(0, rowCount);
} catch (e) {
if (rowCount === 1 && e.code === 'InvalidArgument') {
console.log("This error means there's no row to delete.")
}
}
}
Если количество строк равно 1 и код ошибки является конкретным, который возвращается, когда мы удаляем 'insert-row', то мы можем игнорировать ошибку. Опять же, лучшим подходом было бы использовать API для объекта таблицы, чтобы получить количество строк и удалить строки только тогда, когда количество строк>= 1. Мы продолжим исследование, чтобы улучшить работу.
Я провел несколько быстрых тестов, удалив 5000 строк (5 столбцов, разные типы данных), используя
deleteRowsAt()
и это постоянно занимало от 20 до 30 секунд. Но ~10 000 строк или больше, и каждый раз у меня был тайм-аут, скрипт так и не закончился. Вызов скрипта из Flow также дал мне тайм-аут шлюза с несколькими повторными попытками до сбоя.
table.deleteRowsAt(0, rowCount);
Но используя
getRangeBetweenHeaderAndTotal()
ссылка на диапазон для удаления работала хорошо, 200 000 строк одних и тех же тестовых данных примерно за 2 секунды. В документации упоминаются диапазоны быстрее, они, безусловно, есть в моих тестах.
table.getRangeBetweenHeaderAndTotal().delete(0);
Если вы хотите удалить всю строку, нам нужно использовать свойство «EntireRow», затем нам нужно использовать метод «Delete», чтобы удалить всю строку выбранной нами ячейки.
row.getEntireRow().delete(ExcelScript.DeleteShiftDirection.up);
В этом примере функция зацикливает первую таблицу на первом листе и удаляет строки со словом «DELETE» в столбце A.
function deleteRows(workbook: ExcelScript.Workbook)
{
let selectedSheet = workbook.getActiveWorksheet();
let myTable = workbook.getTables()[0];
let rowCount = myTable.getRangeBetweenHeaderAndTotal().getRowCount();
for (let x = 1; x < rowCount; x = x + 1) {
let row = myTable.getRangeBetweenHeaderAndTotal().getRow(x - 1);
if (row.getColumn(0).getValue() == "DELETE") {
console.log("deleting " + row.getColumn(8).getValue());
row.getEntireRow().delete(ExcelScript.DeleteShiftDirection.up);
}
}
}