如何找到具有非空单元格的数组的最后一行?

时间:2018-11-10 11:35:47

标签: google-sheets

//样品表here

嗨,

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

到目前为止我可以做什么:

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

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

或过滤条件选择的行(在我的情况下,过滤条件选择为25,而工作表为38)

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

我还不知道怎么做:

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

欢呼

2 个答案:

答案 0 :(得分:1)

此自定义函数将执行此操作。有时,脚本比某些奇怪的公式(IMHO)容易得多。它只会逐行遍历数据,并在找到数据时记下行号,即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. 我发现Google脚本缓存了custom的结果 公式,并仅返回缓存的值,即使 工作表已更改。这是奇怪的行为,但目的是 减少CPU时间。解决方法是在可能的范围内传递 更改,这将导致函数重新计算。我更新了 公式和被调用的函数是这样的:

    =findHighestNonEmptyRow(N2:R42)
    

    嘿,一切正常!

  3. 坚持公式...但是,我们俩都从您那里学到了很多东西 我想的问题,谢谢你!

答案 1 :(得分:1)

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

=max(filter(row(N2:N), MMULT(N(N2:R<>""), transpose(column(N2:R2)^0))>0))