获取Google表格中列中的最后一个非空单元格

Mic*_*elS 114 worksheet-function google-sheets google-sheets-formula

我使用以下功能

=DAYS360(A2, A35)
Run Code Online (Sandbox Code Playgroud)

计算我的专栏中两个日期之间的差异.但是,该列正在不断扩展,我现在必须在更新电子表格时手动更改"A35".

有没有办法(在Google表格中)找到此列中的最后一个非空单元格,然后在上面的函数中动态设置该参数?

Sam*_*lus 147

可能有一种更有说服力的方式,但这是我提出的方式:

查找列中最后一个填充单元格的函数是:

=INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) )
Run Code Online (Sandbox Code Playgroud)

因此,如果将它与当前函数结合使用,它将如下所示:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))
Run Code Online (Sandbox Code Playgroud)

  • 我最后比较了空字符串,而不是使用ISBLANK,后者处理一些空白的单元格(例如空白返回公式,如=""作为非空白.因此:'=索引(过滤器(A:A,A:A) <>""),行(过滤器(A:A,A:A <>"")))' (4认同)
  • 略微简化的答案,也可以处理空格,作者:道格·布拉德肖(Doug Bradshaw):`= INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))`(可以更改起始行A1)的完整说明网址:https://stackoverflow.com/a/27623407/539149 (3认同)

xxx*_*nce 72

为了找到可以使用的最后一个非空单元格INDEXMATCH功能如下:

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))
Run Code Online (Sandbox Code Playgroud)

我认为这更快更容易.

  • 如果值是数字,您的方法似乎只找到最后一个单元格,如果也是字符串类型,我的方法将找到最后一行.最初的问题是关于日期,所以这可行,但看到文章仍然受到关注,值得注意的是差异.这一切都取决于您的需求.如果你只是需要一个号码我推荐这种方式. (20认同)
  • 你能解释为什么/如何运作? (3认同)
  • 这假设列已排序 (2认同)
  • 也可以像 `=DAYS360(A2;VLOOKUP(99^99;A:A;1))` 那样完成 (2认同)

Rub*_*bén 50

如果A2:A连续包含日期,则INDEX(A2:A,COUNT(A2:A))将返回最后日期.最后的公式是

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
Run Code Online (Sandbox Code Playgroud)

  • 我个人认为这应该是公认的答案.简洁明了. (9认同)
  • 这是最准确的答案.虽然@Poul上面的答案适用于这种情况,但我想找到具有实际数据的实际最后一个单元格,这样就可以得到数据是否有序. (4认同)
  • 太棒了.第二,它应该是接受的答案的动议. (4认同)

Eri*_*ing 30

我最喜欢的是:

=INDEX(A2:A,COUNTA(A2:A),1)
Run Code Online (Sandbox Code Playgroud)

因此,对于OP的需求:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答问题——它选择最后一个值,但不是最后一个非空值。 (2认同)

Pou*_*oul 16

如果列只是通过连续添加日期扩展,就像我的情况一样 - 我只使用MAX函数来获取最后一个日期.

最终的公式将是:

=DAYS360(A2; MAX(A2:A)) 
Run Code Online (Sandbox Code Playgroud)

  • 天才!简单有效. (3认同)

Ram*_*lat 11

虽然问题已经得到解答,但有一种雄辩的方法可以做到.

Use just the column name to denote last non-empty row of that column.
Run Code Online (Sandbox Code Playgroud)

例如:

如果您的数据已经存在,A1:A100并且您希望能够向A列添加更多数据,可以说A1:A105甚至更A1:A1234晚,您可以使用此范围:

A1:A
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,但也看到过一些问题,它有时会返回倒数第二个项目而不是最后一个项目。 (2认同)

小智 10

这似乎是我发现在不断扩展的列中检索最后一个值的最简单的解决方案:

=INDEX(A:A,COUNTA(A:A),1)
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效并且非常干净,但是如果您想要一行中的最后一个非空单元格可以包含未知数量的空单元格,那么您需要Atul的答案(/sf/answers/4182589911/ ) (2认同)

小智 10

为了严格查找列中的最后一个非空单元格,这应该有效......

=LOOKUP(2^99, A2:A)
Run Code Online (Sandbox Code Playgroud)


Atu*_*tul 8

这对我有用。获取 Google 表格中 A 列的最后一个值:

=index(A:A,max(row(A:A)*(A:A<>"")))
Run Code Online (Sandbox Code Playgroud)

(如果有的话,它也会跳过中间的空白行)


And*_*son 6

获取最后一个值的公式怎么样:

=index(G:G;max((G:G<>"")*row(G:G)))
Run Code Online (Sandbox Code Playgroud)

这将是您原始任务的最终公式:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))
Run Code Online (Sandbox Code Playgroud)

假设您的初始日期是G10.


Mea*_*arg 6

这是另一个:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))
Run Code Online (Sandbox Code Playgroud)

最终方程式是:

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))
Run Code Online (Sandbox Code Playgroud)

这里的其他方程式也可以使用,但是我喜欢这个方程式,因为它使行号的获取变得容易,我发现我需要做更多的事情。仅行号将是这样的:

=max(arrayformula(if(A:A<>"",row(A:A),"")))
Run Code Online (Sandbox Code Playgroud)

我最初只是想找到解决电子表格问题的方法,但找不到任何有用的方法来提供最后一个条目的行号,因此希望对某些人有所帮助。

同样,这样做还有一个好处,它可以按任何顺序适用于任何类型的数据,并且在包含内容的行之间可以有空白行,并且不计算公式为“”的单元格。它还可以处理重复的值。总而言之,它与在此处使用max((G:G <>“”“)* row(G:G))的方程式非常相似,但是如果您要这样做,则可以更轻松地提取行号。

另外,如果您想在自己的工作表上放置脚本,那么如果您打算做很多事情,可以使自己变得很容易。这是脚本:

function lastRow(sheet,column) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (column == null) {
    if (sheet != null) {
       var sheet = ss.getSheetByName(sheet);
    } else {
      var sheet = ss.getActiveSheet();
    }
    return sheet.getLastRow();
  } else {
    var sheet = ss.getSheetByName(sheet);
    var lastRow = sheet.getLastRow();
    var array = sheet.getRange(column + 1 + ':' + column + lastRow).getValues();
    for (i=0;i<array.length;i++) {
      if (array[i] != '') {       
        var final = i + 1;
      }
    }
    if (final != null) {
      return final;
    } else {
      return 0;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要在当前正在编辑的图纸的最后一行上输入以下内容,您可以在此处键入以下内容:

=LASTROW()
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要该工作表中特定列的最后一行,或者想要另一工作表中特定列的最后一行,则可以执行以下操作:

=LASTROW("Sheet1","A")
Run Code Online (Sandbox Code Playgroud)

通常,对于特定工作表的最后一行:

=LASTROW("Sheet1")
Run Code Online (Sandbox Code Playgroud)

然后,可以使用间接方法来获取实际数据:

=INDIRECT("A"&LASTROW())
Run Code Online (Sandbox Code Playgroud)

或者,您可以在最后两行返回行处修改上面的脚本(由于必须将工作表和列都放进去才能从实际列中获得实际值,所以需要最后两行),并用以下内容替换变量:

return sheet.getRange(column + final).getValue();
Run Code Online (Sandbox Code Playgroud)

return sheet.getRange(column + lastRow).getValue();
Run Code Online (Sandbox Code Playgroud)

该脚本的一个好处是,您可以选择是否要包含计算结果为“”的方程式。如果未添加任何参数,将计算计算为“”的方程式,但是如果指定工作表和列,则将计算它们。另外,如果您愿意使用脚本的变体,那么它具有很大的灵活性。

可能过度杀伤,但所有可能。


Tam*_*dav 5

我走了一条不同的路。因为我知道我会一个一个地向一行/列添加一些东西,所以我通过首先计算有数据的字段来找出最后一行。我将用一列来演示这一点:

=COUNT(A5:A34)
Run Code Online (Sandbox Code Playgroud)

所以,假设返回 21。A5 向下 4 行,所以我需要从第 4 行向下获得第 21 个位置。我可以使用 inderect 来做到这一点,如下所示:

=INDIRECT("A"&COUNT(A5:A34)+4)
Run Code Online (Sandbox Code Playgroud)

它正在查找包含数据的行数,并返回一个我用作索引修饰符的数字。