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

Posted

技术标签:

【中文标题】获取 Google 表格列中的最后一个非空单元格【英文标题】:Get the last non-empty cell in a column in Google Sheets 【发布时间】:2011-12-28 07:10:27 【问题描述】:

我使用如下函数

=DAYS360(A2, A35)

计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。

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

【问题讨论】:

类似问题:***.com/questions/4169914/… 【参考方案1】:

可能有更雄辩的方式,但这是我想出的方式:

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

=INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) )

所以如果你把它和你当前的函数结合起来,它会是这样的:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))

【讨论】:

我最终与空字符串进行比较,而不是使用 ISBLANK,它将一些看起来为空的单元格(例如,返回空白的公式,如 ="" 视为非空白。因此:'=index(filter (A:A, A:A""), rows(filter(A:A, A:A"")))' 由于公式,我也遇到了 ISBLANK 问题。但使用 =INDEX( FILTER( F3:F; F3:F"" ) ) ; ROWS( FILTER( F3:F; F3:F"" ) ) 结果公式解析错误。知道有什么问题吗? 问题。如果不是 A:A,而是一个 importrange(),如何在不执行相同的 importrange() 4 次的情况下重写它? Doug Bradshaw 的稍微简化的答案也可以处理空白:=INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(可以更改起始行 A1)完整描述:***.com/a/27623407/539149 有什么方法可以忽略非数字值(例如同一列中的标题单元格)?【参考方案2】:

要查找最后一个非空单元格,您可以使用 INDEXMATCH 函数,如下所示:

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

我认为这更快更容易。

【讨论】:

如果值是数字,您的方法似乎只找到最后一个单元格,如果也是字符串类型,我的方法将找到最后一行。最初的问题是关于日期的,所以这会起作用,但鉴于文章仍然受到关注,值得注意的是差异。这一切都取决于您的需求。如果你只需要一个号码,我推荐这种方式。 假设列已排序 也可以使用=DAYS360(A2;VLOOKUP(99^99;A:A;1))【参考方案3】:

如果 A2:A 连续包含日期,则 INDEX(A2:A,COUNT(A2:A)) 将返回最后一个日期。最终公式为

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))

【讨论】:

这是最准确的答案。虽然上面@Poul 的答案适用于这种情况,但我想找到带有实际数据的实际最后一个单元格,无论数据是否有序,都可以得到它。 甜蜜!简单而正是我想要的。【参考方案4】:

我最喜欢的是:

=INDEX(A2:A,COUNTA(A2:A),1)

所以,对于 OP 的需要:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))

【讨论】:

...虽然上面发布的 Poul 的“MAX”在最后日期总是最新的情况下看起来更干净。 他的意思是 +1 不是 ,1 这没有回答问题——它选择最后一个值,但不是最后一个非空值。【参考方案5】:

虽然这个问题已经回答了,但是有一个雄辩的方法可以做到。

Use just the column name to denote last non-empty row of that column.

例如:

如果您的数据在 A1:A100 中,并且您希望能够向 A 列添加更多数据,例如以后可以是 A1:A105 甚至是 A1:A1234,您可以使用此范围:

A1:A

所以要获得一个范围内的最后一个非空值,我们将使用 2 个函数:

COUNTA 索引

答案是=INDEX(B3:B,COUNTA(B3:B))

解释如下:

COUNTA(range) 返回一个范围内的值的数量,我们可以使用它来获取行数。

INDEX(range, row, col) 返回位置范围内的值 rowcolcol=1 如果未指定)

例子:

INDEX(A1:C5,1,1) = A1
INDEX(A1:C5,1) = A1 # implicitly states that col = 1
INDEX(A1:C5,1,2) = A2
INDEX(A1:C5,2,1) = B1
INDEX(A1:C5,2,2) = B2
INDEX(A1:C5,3,1) = C1
INDEX(A1:C5,3,2) = C2

对于上图,我们的范围是B3:B。所以我们首先计算B3:BCOUNTA(B3:B) 范围内有多少值。在左侧,它将产生 8,因为有 8 个值,而在右侧将产生 9。我们还知道最后一个值在B3:B 范围的第一列,因此INDEXcol 参数必须为1,row 参数应为COUNTA(B3:B)

PS:请点赞@bloodymurderlive 的answer,因为是他先写的,我这里只是解释一下。

【讨论】:

我喜欢这个,但也看到了它有时会返回倒数第二项而不是最后一项的问题。 @EricSmalling 可能会发生这种情况,因为您在所有行的末尾都有一个额外的换行符,并且当您复制粘贴它时,它可能被视为非空单元格。您是否有任何暴露此问题的示例电子表格? 它不起作用。你从哪里得到 btw 的报价?我认为它来自 Google 表格文档。 @RamazanPolat: OP 正在询问 如何(在 Google 表格中)找到列中最后一个非空单元格 A1:A 没有给我最后一个非空单元格A列中的值 好像最后一个参数1是不必要的。【参考方案6】:

如果列仅按连续添加的日期扩展 就我而言 - 我只使用 MAX 函数来获取最后日期。

最终公式为:

=DAYS360(A2; MAX(A2:A)) 

【讨论】:

【参考方案7】:

这是另一个:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))

最后的等式是这样的:

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))

这里的其他公式也有效,但我喜欢这个公式,因为它使获取行号变得容易,我发现我需要更频繁地这样做。只是行号是这样的:

=max(arrayformula(if(A:A<>"",row(A:A),"")))

我最初试图找到这个来解决电子表格问题,但找不到任何有用的东西,只是给出了最后一个条目的行号,所以希望这对某人有帮助。

此外,它还有一个额外的优势,即它适用于任何顺序的任何类型的数据,并且您可以在包含内容的行之间有空白行,并且它不计算公式计算为“”的单元格。它还可以处理重复值。总而言之,它与在这里使用 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;
    
  

如果您希望将最后一行放在当前正在编辑的工作表上,您只需在此处输入以下内容:

=LASTROW()

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

=LASTROW("Sheet1","A")

一般来说,对于特定工作表的最后一行:

=LASTROW("Sheet1")

然后要获取实际数据,您可以使用间接:

=INDIRECT("A"&LASTROW())

或者您可以在最后两个返回行修改上述脚本(最后两个,因为您必须同时放置工作表和列才能从实际列中获取实际值),并将变量替换为以下内容:

return sheet.getRange(column + final).getValue();

return sheet.getRange(column + lastRow).getValue();

此脚本的一个好处是您可以选择是否要包含计算结果为“”的方程式。如果没有添加参数,则计算为 "" 的方程将被计算在内,但如果您指定工作表和列,它们现在将被计算在内。此外,如果您愿意使用脚本的变体,还有很大的灵活性。

可能有点矫枉过正,但一切皆有可能。

【讨论】:

“未知函数 LASTROW” 实际回答问题标题应该是 +100:最后一行,而不是最后一行中的值 谢谢!这帮助我弄清楚如何让它处理在我真正想要找到的最后一个值下方的所有条目中都有一个公式的数据,所以它们在技术上不是空白的......但这很有效。 :)【参考方案8】:

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

=index(A:A,max(row(A:A)*(A:A<>"")))

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

【讨论】:

【参考方案9】:

这似乎是我找到的最简单的解决方案,用于检索不断扩展的列中的最后一个值:

=INDEX(A:A,COUNTA(A:A),1)

【讨论】:

这很好用而且非常干净,但是如果您想要一行中的最后一个非空单元格可以包含未知数量的空单元格,那么您需要 Atul 的回答 (***.com/a/59751284/633921) 【参考方案10】:

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

=index(G:G;max((G:G<>"")*row(G:G)))

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

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

假设您的初始日期在 G10。

【讨论】:

【参考方案11】:

我走了一条不同的路。因为我知道我将一个一个地添加到行/列中,所以我通过首先计算具有数据的字段来找出最后一行。我将用一个专栏来证明这一点:

=COUNT(A5:A34)

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

=INDIRECT("A"&COUNT(A5:A34)+4)

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

【讨论】:

注意不能有空单元格。此外,COUNTA 应该适合更多场景【参考方案12】:

连续:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

对于一列:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

【讨论】:

【参考方案13】:

计算 A 列中的最新日期与单元格 A2 中的日期之间的差异。

=MAX(A2:A)-A2

【讨论】:

【参考方案14】:

为了找到最后一个非空行号(它们之间允许有空格),我在下面使用了搜索列 A

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))

【讨论】:

【参考方案15】:

这将给出最后一个单元格的内容:

=indirect("A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>""))))

这将给出最后一个单元格的地址:

="A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

这将给出最后一个单元格的行:

=max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

也许您更喜欢脚本。这个脚本比上面其他人发布的大脚本要短​​得多:

转到脚本编辑器并保存此脚本:

function getLastRow(range)
  while(range.length>0 && range[range.length-1][0]=='') range.pop();
  return range.length;

完成后,您只需在单元格中输入:

=getLastRow(A:A)

【讨论】:

【参考方案16】:

为了严格查找列中的最后一个非空单元格,这应该可以工作...

=LOOKUP(2^99, A2:A)

【讨论】:

【参考方案17】:

业余爱好者的做法是“=CONCATENATE("A",COUNTUNIQUE(A1:A9999))”,其中 A1 是列中的第一个单元格,而 A9999 比我预期的更远任何条目。这个结果 A# 可以根据需要与 INDIRECT 函数一起使用。

【讨论】:

对不起。这仅适用于列中的所有条目都是唯一的。 虽然我感谢您对 *** 的贡献,Conrad,但您的回答存在一些问题。首先,他没有指定日期是唯一的,因此您应该使用 count(),而不是 countunique()。其次,使用indirect() 和concatenate 复制了index() 的现有功能,正如您在其他答案中看到的那样。第三,为什么不直接使用 A1:A 而不是 A1:A9999?【参考方案18】:

Ben Collins 是一位 Google 表格专家,他在自己的网站上提供了许多免费提示,还提供课程。他有一篇关于动态范围名称的免费文章,我在许多项目中都以此为基础。

https://www.benlcollins.com/formula-examples/dynamic-named-ranges/

免责声明,引用 Ben 的网站对我没有任何好处。

这是我使用动态范围的一个项目的屏幕截图:

单元格 D3 具有如上所示的公式,但这是一个数组公式:

=ArrayFormula(MAX(IF(L2s!A2:A1009<>"",ROW(2:1011))))

单元格 D4 有这个公式:

="L2s!A2:E"&D3

【讨论】:

【参考方案19】:

这可能有效:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A)))

【讨论】:

以上是关于获取 Google 表格列中的最后一个非空单元格的主要内容,如果未能解决你的问题,请参考以下文章

Arrayformula 返回多行中的最后一个非空单元格

获取相邻列中最近的非空单元格的行索引(Excel)

根据 Google 表格中的第一个单元格格式化列中的单元格

Google 表格月底日期

如果文本被另一个单元格匹配,请使用Google Apps脚本有条理地格式化一个单元格

SQL Server 2008 R2:从列中获取第一个非空值