在 Excelscript for web 中快速迭代一个范围
Iterate over a Range fast in Excelscript for web
我想检查单元格范围是否为空或其中是否包含任何值,我使用此 for loop
:
for (let i = 0; i <= namesRange.getCellCount(); i++) {
if (namesRange.getCell(i,0).getText() == "")
{
break;
}
bookedCount += 1;
}
但是这个迭代非常慢(使用Range.getValue
也是如此,但是控制台会警告你使用.getValue
迭代很慢,不会警告你使用getText
)迭代包含 10 个元素的非常短的列表需要几秒钟。
有没有什么方法可以使用 ExcelScripts 快速检查单元格的值?
这是否意味着,即使我使用 office.js 和 Node.js 开发 UDF 或功能区加载项,迭代单元格也会如此缓慢?
有什么方法可以让它更快吗?
您的代码执行缓慢的原因可能是对 getCell()
和 getText()
的调用开销很大。您可以尝试不同的方法,而不是每次都在循环中执行这些调用。一种方法是获取一组单元格值并对其进行迭代。您可以使用 namesRange
变量来获取值数组。您还可以使用它来获取范围的行数和列数。使用此信息,您应该能够编写嵌套的 for 循环来遍历数组。下面是您可以如何执行此操作的示例:
function main(workbook: ExcelScript.Workbook) {
let namesRange: ExcelScript.Range = workbook.getActiveWorksheet().getRange("A1");
let rowCount: number = namesRange.getRowCount();
let colCount: number = namesRange.getColumnCount();
let vals: string[][] = namesRange.getValues() as string[][];
for (let i = 0; i < rowCount; i++) {
for (let j = 0; j < colCount; j++) {
if (vals[i][j] == "") {
//additional code here
}
}
}
}
第一个答案的另一种替代方法是对值范围内的每个单元格使用 forEach
方法。
它可以减少实现预期结果所需的变量数量。
function main(workbook: ExcelScript.Workbook)
{
let worksheet = workbook.getActiveWorksheet();
let usedRange = worksheet.getUsedRange().getValues();
usedRange.forEach(row => {
row.forEach(cellValue => {
console.log(cellValue);
});
});
}
我想检查单元格范围是否为空或其中是否包含任何值,我使用此 for loop
:
for (let i = 0; i <= namesRange.getCellCount(); i++) {
if (namesRange.getCell(i,0).getText() == "")
{
break;
}
bookedCount += 1;
}
但是这个迭代非常慢(使用Range.getValue
也是如此,但是控制台会警告你使用.getValue
迭代很慢,不会警告你使用getText
)迭代包含 10 个元素的非常短的列表需要几秒钟。
有没有什么方法可以使用 ExcelScripts 快速检查单元格的值?
这是否意味着,即使我使用 office.js 和 Node.js 开发 UDF 或功能区加载项,迭代单元格也会如此缓慢?
有什么方法可以让它更快吗?
您的代码执行缓慢的原因可能是对 getCell()
和 getText()
的调用开销很大。您可以尝试不同的方法,而不是每次都在循环中执行这些调用。一种方法是获取一组单元格值并对其进行迭代。您可以使用 namesRange
变量来获取值数组。您还可以使用它来获取范围的行数和列数。使用此信息,您应该能够编写嵌套的 for 循环来遍历数组。下面是您可以如何执行此操作的示例:
function main(workbook: ExcelScript.Workbook) {
let namesRange: ExcelScript.Range = workbook.getActiveWorksheet().getRange("A1");
let rowCount: number = namesRange.getRowCount();
let colCount: number = namesRange.getColumnCount();
let vals: string[][] = namesRange.getValues() as string[][];
for (let i = 0; i < rowCount; i++) {
for (let j = 0; j < colCount; j++) {
if (vals[i][j] == "") {
//additional code here
}
}
}
}
第一个答案的另一种替代方法是对值范围内的每个单元格使用 forEach
方法。
它可以减少实现预期结果所需的变量数量。
function main(workbook: ExcelScript.Workbook)
{
let worksheet = workbook.getActiveWorksheet();
let usedRange = worksheet.getUsedRange().getValues();
usedRange.forEach(row => {
row.forEach(cellValue => {
console.log(cellValue);
});
});
}