Как удалить все строки в таблице с помощью скриптов 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 ответа

Решение

ОБНОВИТЬ:

Теперь у нас есть getRowCountAPI в таблице, который можно использовать для решения этого сценария. Он вернет фактические строки (не считая строки заголовка или раскрытия).

    // 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);
    }
  }    
}
Другие вопросы по тегам