0

//这里是样张

你好,

我正在使用公式来计算数组 N:R。计算后,我想用非空单元格确定数组的最后一行(空单元格不是空白)。

到目前为止我能做的:

返回列的最后一个非空单元格

=INDEX(FILTER(O:O,O:O<>""), ROWS(FILTER(O:O,O:O<>"")))

或过滤器选择的行(在我的情况下,过滤器选择中的 25 与工作表中的 38 )

=ROWS(FILTER(O:O,O:O<>""))

我还没有弄清楚如何:

  1. 搜索整个数组,而不是一次只搜索一行
  2. 返回数组中最后一个非空单元格的行

干杯

4

2 回答 2

1

这个自定义函数会做到这一点。有时脚本比出现的一些奇怪的公式要容易得多(恕我直言)。它只是逐行遍历数据,如果找到数据,则记录行号,即cell.value() != ""

function findHighestNonEmptyRow(dummyRange){
  var sheet = SpreadsheetApp.getActive();
  var range = sheet.getRange("N:R");
  var valuesRC = range.getValues();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();

  var highestNonEmptyRow = 0;

  for (var row = 0; row < numRows; row++) {
    for (var col = 0; col < numCols; col++) {
      if (valuesRC[row][col] != ""){
        highestNonEmptyRow = row+1;  // +1 to offset loop variable
      }
    }
  }
  Logger.log(highestNonEmptyRow);
  return highestNonEmptyRow;
}

日志显示正确的值38。您可以删除 Logger.log(highestNonEmptyRow); 测试后就行了。

我把公式放在W44你的测试表里了......

编辑:由于反馈一切都不像预期的那样......

  1. 第一个脚本中有一个错字:这行var range = sheet.getRange("N:D"); 应该是var range = sheet.getRange("N:R");
  2. 我发现谷歌脚本缓存了自定义公式的结果,并且只返回缓存的值,即使工作表上的内容发生了变化。这是一种奇怪的行为,但旨在减少 CPU 时间。解决方法是传入一个可能会更改的范围,这会导致函数重新计算。我更新了公式并调用了这样的函数:

    =findHighestNonEmptyRow(N2:R42)
    

    嘿,这一切都有效!

  3. 坚持这个公式......但是,我认为我们都从你的问题中学到了很多东西,所以谢谢你!
于 2018-11-12T00:14:30.740 回答
1

对于公式化的方法,您可以尝试

=max(filter(row(N2:N), MMULT(N(N2:R<>""), transpose(column(N2:R2)^0))>0))
于 2018-11-12T06:41:15.593 回答