如何使用 Office 脚本删除 table 中的所有行
How to delete all rows in a table using Office Scripts
我在电子表格中有一个 table,我想删除所有现有数据。我使用下面的代码,除非 table 已经为空。
// Get the row count
let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();
// Delete all the rows
table.deleteRowsAt(0,rowCount);
问题是即使 table 为空,rowCount 也会 return 1。当 deleteRowsAt
尝试删除空 table 中的行时,它 return 是一个错误。
在 VBA 中我们可以使用 table.ListRows.Count
如果 table 为空,这将 return 0。
示例:我在 table 中有 3 行
如果我 select 所有行并将它们从 Table 中删除,我得到这个:
此 table 现在没有行,但我无法获得此结果。正如我所说,在 VBA 中我们将使用 table.ListRows.Count
而这将是 return 0 但我似乎找不到 Office 脚本的等效项。
更新:
我们现在在 table 上有 getRowCount
API,您可以使用它来解决这个问题。它将 return 实际行(不计算 header 或扩展行)。
// 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' 时 return 编辑的特定代码,那么我们可以忽略该错误。
同样,更好的方法是在 table object 上使用 API 来获取行数并仅在行数 >= 1 时删除行。我们将进一步调查以改进经验。
我 运行 一些使用 deleteRowsAt()
删除 5,000 行(5 列,不同数据类型)的快速测试,它始终需要 20 到 30 秒。但是大约 10,000 行或更多,我每次都超时,脚本从未完成。从 Flow 调用脚本也让我在失败前多次重新尝试网关超时。
table.deleteRowsAt(0, rowCount);
但是使用getRangeBetweenHeaderAndTotal()
引用一个运行ge进行删除效果很好,200,000行相同的测试数据在大约2秒内完成。文档提到 运行ges 更快,它们肯定在我的测试中。
table.getRangeBetweenHeaderAndTotal().delete(0);
我在电子表格中有一个 table,我想删除所有现有数据。我使用下面的代码,除非 table 已经为空。
// Get the row count
let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();
// Delete all the rows
table.deleteRowsAt(0,rowCount);
问题是即使 table 为空,rowCount 也会 return 1。当 deleteRowsAt
尝试删除空 table 中的行时,它 return 是一个错误。
在 VBA 中我们可以使用 table.ListRows.Count
如果 table 为空,这将 return 0。
示例:我在 table 中有 3 行
如果我 select 所有行并将它们从 Table 中删除,我得到这个:
此 table 现在没有行,但我无法获得此结果。正如我所说,在 VBA 中我们将使用 table.ListRows.Count
而这将是 return 0 但我似乎找不到 Office 脚本的等效项。
更新:
我们现在在 table 上有 getRowCount
API,您可以使用它来解决这个问题。它将 return 实际行(不计算 header 或扩展行)。
// 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' 时 return 编辑的特定代码,那么我们可以忽略该错误。 同样,更好的方法是在 table object 上使用 API 来获取行数并仅在行数 >= 1 时删除行。我们将进一步调查以改进经验。
我 运行 一些使用 deleteRowsAt()
删除 5,000 行(5 列,不同数据类型)的快速测试,它始终需要 20 到 30 秒。但是大约 10,000 行或更多,我每次都超时,脚本从未完成。从 Flow 调用脚本也让我在失败前多次重新尝试网关超时。
table.deleteRowsAt(0, rowCount);
但是使用getRangeBetweenHeaderAndTotal()
引用一个运行ge进行删除效果很好,200,000行相同的测试数据在大约2秒内完成。文档提到 运行ges 更快,它们肯定在我的测试中。
table.getRangeBetweenHeaderAndTotal().delete(0);