选择列的最后一个值

cam*_*aca 106 google-sheets google-apps-script array-formulas custom-function google-sheets-formula

我有一个电子表格,在G列中有一些值.有些单元格之间是空的,我需要从该列的最后一个值到另一个单元格.

就像是:

=LAST(G2:G9999)
Run Code Online (Sandbox Code Playgroud)

除了这LAST不是一个功能.

小智 164

类似的回答caligari的答案,但我们可以通过指定完整的列范围来整理它:

=INDEX(G2:G, COUNT(G2:G))
Run Code Online (Sandbox Code Playgroud)

  • 只要数据集中没有空格,这似乎就可以工作 (12认同)
  • 正如@KeithSirmons所说.你的列中有空白它不起作用,因为`COUNT(G2:G)`返回0.而是使用`COUNTA(G2:G)`,它只计算数据集中的值数.如果您的值之间没有一个空格,`COUNTA`仅与'INDEX`结合使用才能获得最后一个值. (8认同)
  • 另请注意,如果您的值不是数字,则需要`COUNTA`.`COUNT`只计算数值:当给出例如文本单元格时它将返回0. (3认同)
  • 优秀的解决方案,这应该被选为答案. (2认同)

tin*_*fni 54

所以这个解决方案以字符串作为参数.它会查找工作表中有多少行.它获取指定列中的所有值.它循环遍历从结尾到开头的值,直到找到不是空字符串的值.最后它重新调整了价值.

脚本:

function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();

  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return values[lastRow - 1];
}
Run Code Online (Sandbox Code Playgroud)

用法:

=lastValue("G")
Run Code Online (Sandbox Code Playgroud)

编辑:

响应要求函数自动更新的注释:

我能找到的最好的方法是使用上面的代码:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
Run Code Online (Sandbox Code Playgroud)

不再需要在像" 使用"部分状态那样的单元格中使用该函数.相反,您正在对要更新的单元格以及要跟踪的列进行硬编码.有可能有一种更有说服力的方式来实现它(希望是一种非硬编码的方式),但这是我现在能找到的最好的方法.

请注意,如果您使用前面所述的单元格中的函数,它将在重新加载时更新.也许有一种方法可以挂钩onEdit()并强制更新单元格函数.我只是在文档中找不到它.

  • 这是Google电子表格脚本.您可以在"工具 - >脚本 - >脚本编辑器..."下创建一个新脚本 (5认同)
  • 我已对此脚本进行了编辑,因此您可以将命名工作表传递给它,如lastValue("Sheet1!A")https://gist.github.com/2701061 (5认同)
  • [dohmoose的回答](http://stackoverflow.com/a/13871043/873263)是最简单的 (3认同)

小智 53

其实我在这里找到了一个更简单的解决方案:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=en

它看起来像这样:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
Run Code Online (Sandbox Code Playgroud)

  • 解释:`ROW`返回行号,因此`FILTER(ROW(A10:A100),NOT(ISBLANK(A10:A100))`返回所有非空行号(不是它们的值)的数组,例如[1,2,3,7,12,14].然后`MAX`给出最后一行编号.然后应用第二个`FILTER`来过滤掉行号与来自`的值不匹配的所有行. MAX`(即最后一个非空行的值). (5认同)
  • 哇,这非常干净.你能解释一下它是如何工作的吗? (2认同)
  • 如果我只想要列的最后一个值的行号怎么办? (2认同)

cal*_*ari 43

目前尚未实现LAST()函数,以便选择范围内的最后一个单元格.但是,按照你的例子:

=LAST(G2:G9999)
Run Code Online (Sandbox Code Playgroud)

我们能够以这种方式使用INDEX()COUNT()函数获取最后一个单元格:

=INDEX(G2:G; COUNT(G2:G))
Run Code Online (Sandbox Code Playgroud)

在spreedsheet上有一个实例,我找到(并解决了)同样的问题(工作表Orzamentos,单元格I5).请注意,它甚至可以完美地引用文档中的其他工作表.

  • 我喜欢这个建议的简洁性,但是当目标范围包含一些空白单元格时(如上面原始问题中所述),它似乎不起作用,因为COUNT()不计算空白单元格. (7认同)

Dou*_*haw 32

摘要:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Run Code Online (Sandbox Code Playgroud)

细节:

我已经查看并尝试了几个答案,这就是我发现的:如果没有空白,最简单的解决方案(参见Dohmoose的答案)是有效的:

=INDEX(G2:G; COUNT(G2:G))
Run Code Online (Sandbox Code Playgroud)

如果你有空白,那就失败了.

您可以通过只是改变处理一个空白COUNTCOUNTA (见user3280071的答案):

=INDEX(G2:G; COUNTA(G2:G))
Run Code Online (Sandbox Code Playgroud)

但是,对于某些空白组合,这将失败.(1 blank 1 blank 1对我不好.)

以下代码有效(请参阅Nader的回答jason的评论):

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Run Code Online (Sandbox Code Playgroud)

但它需要考虑是否要使用COLUMNSROWS给定范围.

但是,如果COLUMNS被替换为COUNT我似乎得到一个可靠的,空白的实现LAST:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) ) 
Run Code Online (Sandbox Code Playgroud)

由于COUNTA内置了过滤器,我们可以进一步简化使用

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Run Code Online (Sandbox Code Playgroud)

这有点简单,也是正确的.而且您不必担心是计算行数还是列数.与脚本解决方案不同,它会随着电子表格的更改自动更新.

如果要连续获取最后一个值,只需更改数据范围:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Run Code Online (Sandbox Code Playgroud)

  • 对于完成每次迭代的步骤和功能+限制非常有帮助。我需要获取每行的最后一个值,其中一些有多个空格。这就像一个魅力。谢谢你! (2认同)

小智 9

要从一列文本值返回最后一个值,您需要使用COUNTA,因此您需要以下公式:

=INDEX(G2:G; COUNTA(G2:G))
Run Code Online (Sandbox Code Playgroud)


And*_*son 7

试试这个: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

假设您要查找最后一个值的列是B.

是的,它适用于空白.


小智 6

看起来Google Apps脚本现在支持范围作为函数参数.此解决方案接受范围:

// Returns row number with the last non-blank value in a column, or the first row
//   number if all are blank.
// Example: =rowWithLastValue(a2:a, 2)
// Arguments
//   range: Spreadsheet range.
//   firstRow: Row number of first row. It would be nice to pull this out of
//     the range parameter, but the information is not available.
function rowWithLastValue(range, firstRow) {
  // range is passed as an array of values from the indicated spreadsheet cells.
  for (var i = range.length - 1;  i >= 0;  -- i) {
    if (range[i] != "")  return i + firstRow;
  }
  return firstRow;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Google Apps脚本帮助论坛中的讨论:如何强制重新计算公式?


小智 6

我看了之前的答案,看起来他们工作太辛苦了.也许脚本支持只是改进了.我认为函数表达如下:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}
Run Code Online (Sandbox Code Playgroud)

在我的电子表格中,我然后使用:

= lastValue(E17:E999)
Run Code Online (Sandbox Code Playgroud)

在函数中,我得到一个值数组,每个引用的单元格有一个,这只是从数组的末尾向后迭代,直到找到非空值或用完元素.在将数据传递给函数之前,应解释表引用.也不足以处理多维度.问题确实要求在一个列中的最后一个单元格,所以它似乎适合.如果你的数据用完了,它可能会死掉.

您的里程可能会有所不同,但这对我有用.


小智 5

function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}
Run Code Online (Sandbox Code Playgroud)

没有硬编码。


Nad*_*der 5

这将获取最后一个值并处理空值:

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


小智 5

这对我有用:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Run Code Online (Sandbox Code Playgroud)


JPV*_*JPV 5

在有空格的列中,您可以使用以下命令获取最后一个值

=+sort(G:G,row(G:G)*(G:G<>""),)
Run Code Online (Sandbox Code Playgroud)