【问题标题】:How to find the last row of an array with a non-empty cell?如何找到具有非空单元格的数组的最后一行?
【发布时间】:2019-04-13 18:42:06
【问题描述】:

//样张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. 返回数组中最后一个非空单元格所在的行

干杯

【问题讨论】:

  • 我很难理解你想在这里实现什么。在我看来,您想出的不是“返回一行的最后一个非空单元格”,而是“……一列”。您是否要搜索多列数组的最后一行,其中 a) 此行的所有列 b) 此行的任何列中有非空单元格?您还在示例中指出数组的最后一个非零项是第 35 行,而我可以将其视为第 38 行。令人困惑。也许更简单的示例表会有所帮助。
  • 是的,你是完全正确的(刚刚编辑它,我给出的第一个公式确实返回了一列的最后一个非空单元格)。我想要完成的是返回多列数组中最后一个非空单元格的行号。正如你提到的,在工作表中它应该是 38(在示例中也将其突出显示得更好)

标签: google-sheets


【解决方案1】:

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

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

【讨论】:

  • 我对人们使用公式所做的事情感到惊讶!我说:-)。干得好。
  • 太好了!完美运行。我试图从内到外理解这个公式。为什么需要数组公式?使用 =filter(row(N2:N), MMULT(N(N2:R""), transpose(column(N2:R2)^0))>0) 提供相同的输出,除了第一个元素数组是'2')。同样在 MMULT(N(N2:R""), transpose(column(N2:R2)^0))>0;转置的参数不会总是导致'1'(除非empty^0给出不同的结果或0^0)。阅读有关 N 函数的信息,但如果 N2:R 不为空,则无法理解 N(N2:R"") 是否返回“1”?谢谢
  • 正确,@jlo。创建 MMULT(需要数组公式)是我创建此公式的第一步。后来忘记拆了。 MMULT 计算每行非空单元格的数量。然后 filter 用于过滤掉 MMULT 返回 0 的行号(=空行)。然后 MAX() 返回最高的行号。很高兴听到它奏效了。
【解决方案2】:

这个自定义函数会做到这一点。有时脚本比出现的一些奇怪的公式要容易得多(恕我直言)。它只是逐行遍历数据,如果找到数据,则记录行号,即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. 坚持公式...但是,我们都从您那里学到了很多 我想是个问题,非常感谢!

【讨论】:

  • 谢谢!有什么方法可以在单元格更改时自动更新自定义公式?例如,在工作表中,我删除了第 38 行中的单元格(因此新结果将是第 37 行 - 现在最后一个非空单元格 -)并且公式化方法更新为 37 但 findHighestNonEmptyRow() 不会跨度>
  • 我会假设自定义公式会在编辑后更新,但如果不是,它可以通过 onEdit 触发器进行。但是,如果您对 JPV 公式感到满意,请使用它,不用担心!如果您希望我做出任何改进,请告诉我,
  • 谢谢!我将使用 onEdit 触发器,我认为自定义公式会自动更新,但显然不是。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多