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

时间:2017-10-23 07:22:09

标签: google-apps-script google-sheets array-formulas

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

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

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

有没有人对解决方法有任何建议?

以下是ARRAYFORMULA

=ArrayFormula(IF(A2:A="",,WEEKNUM(A2:A, 2)))

3 个答案:

答案 0 :(得分:2)

问题:

  • 传统使用ARRAYFORMULA()
  • ,在所有可用行中无法添加空字符串

解决方案:

  • ARRAYFORMULA正确使用INDEX/COUNTA(以确定所需的最后一行)可确保公式仅填充到所需的行而不是伪装

    < / LI>
  • 假设您的数据之间没有空白,

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

答案 1 :(得分:0)

另一种解决方案是使用

临时删除ArrayFormulas
sheet.getRange("location of array formula").setValue('');

然后计算lastRow

var lastRow = sheet.getLastRow();

然后替换arrayformula

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

答案 2 :(得分:0)

这是一个函数,可用于确定lastRow值的“真” lastColumnSheet值。它将处理杂乱的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;
}