2

我在电子表格上有一个表格,我想删除所有现有数据。我使用下面的代码,除非表已经为空,否则该代码有效。

// 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 脚本的等价物。

4

2 回答 2

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 并且错误代码是我们删除“插入行”时返回的特定代码,那么我们可以忽略该错误。同样,更好的方法是在表对象上使用 API 来获取行数并仅在行数 >= 1 时删除行。我们将进一步调查以改善体验。

于 2020-08-04T17:31:02.920 回答
1

我使用删除 5,000 行(5 列,不同的数据类型)进行了一些快速测试,deleteRowsAt()并且始终需要 20 到 30 秒。但是〜10,000行或更多,我每次都超时,脚本从未完成。从 Flow 调用脚本也给了我网关超时,在失败之前多次重试。

table.deleteRowsAt(0, rowCount);

但是使用getRangeBetweenHeaderAndTotal()引用范围进行删除效果很好,大约 2 秒内 200,000 行相同的测试数据。文档提到范围更快,它们肯定在我的测试中。

table.getRangeBetweenHeaderAndTotal().delete(0);
于 2020-09-29T23:06:08.353 回答