在 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);
    });
  });
}