ArrayFormula破坏了getLastRow()函数。可能的解决方法?

问题描述 投票:0回答:1

在我的电子表格中,我有一个正在运行的脚本,它使用的是 getLastRow() 函数作为其逻辑的一个重要部分。

自从我在其中一列中应用了数组公式后,我就把 getLastRow() 函数不能正常工作。似乎数组公式一直 "应用 "到工作表的底部,即使其他列中没有其他值,因此。getLastRow() 返回的是有数组公式的最后一行,而不是实际的非空行。

对我来说,写一个缓慢的函数来检查哪些单元格是空的是不可行的,因为这样的脚本运行会耗尽时间(它有几万行)。

有谁有什么建议可以解决?

下面是 ARRAYFORMULA:

=ArrayFormula(IF(A2:A="",,WEEKNUM(A2:A, 2)))
javascript jquery google-apps-script google-sheets array-formulas
1个回答
6
投票

问题。

  • 传统的使用方法在所有可用行中添加空字符串是不可取的。ARRAYFORMULA()

解决办法。

  • 使用 ARRAYFORMULA 妥帖 INDEX/COUNTA(确定需要的最后一行)确保公式只填到需要的那一行,而不是伪装。

  • 假设你的数据之间没有空白。

      =ARRAYFORMULA(WEEKNUM(A2:INDEX(A2:A,COUNTA(A2:A)),2))
    

0
投票

另一个解决方案是暂时删除ArrayFormulas与

sheet.getRange("location of array formula").setValue('');

然后计算lastRow

var lastRow = sheet.getLastRow();

然后替换数组公式

sheet.getRange("location of array formula").setFormula('the formula');

0
投票

下面是一个函数,你可以用它来确定 "真"。lastRowlastColumn 的值 Sheet 值。它既能处理混乱的 ArrayFormula() 和合并后的细胞。

function getSheetBoundaries2(sheet) {
  var dim = { lastColumn: 1, lastRow: 1 };
  sheet.getDataRange().getMergedRanges()
    .forEach(function (e) {
      var lastColumn = e.getLastColumn();
      var lastRow = e.getLastRow();
      if (lastColumn > dim.lastColumn) dim.lastColumn = lastColumn;
      if (lastRow > dim.lastRow) dim.lastRow = lastRow;
    });
  var rowCount = sheet.getMaxRows();
  var columnCount = sheet.getMaxColumns();
  var dataRange = sheet.getRange(1, 1, rowCount, columnCount).getValues();
  for (var rowIndex = rowCount; rowIndex > 0; rowIndex -= 1) {
    var row = dataRange[rowIndex - 1];
    if (row.join('').length > 0) {
      for (var columnIndex = columnCount; columnIndex > dim.lastColumn; columnIndex -= 1) {
        if (("" + row[columnIndex - 1]).length > 0) dim.lastColumn = columnIndex;
      }
      if (dim.lastRow < rowIndex) dim.lastRow = rowIndex;
    }
  }
  return dim;
}
© www.soinside.com 2019 - 2024. All rights reserved.