108

我有一个电子表格,其中 G 列中有一些值。其中一些单元格是空的,我需要将该列中的最后一个值放入另一个单元格。

就像是:

=LAST(G2:G9999)

除了那LAST不是一个功能。

4

23 回答 23

167

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

=INDEX(G2:G, COUNT(G2:G))
于 2012-12-14T00:41:53.333 回答
55

因此,此解决方案将字符串作为其参数。它找出工作表中有多少行。它获取指定列中的所有值。它从末尾到开头循环遍历值,直到找到一个不是空字符串的值。最后它返回值。

脚本:

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];
}

用法:

=lastValue("G")

编辑:

针对要求该功能自动更新的评论:

我能找到的最好方法是将其与上面的代码一起使用:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

不再需要像“使用”部分所述那样在单元格中使用该功能。相反,您对要更新的单元格和要跟踪的列进行硬编码。可能有一种更雄辩的方式来实现这一点(希望不是硬编码的方式),但这是我目前能找到的最好的方式。

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

于 2010-11-18T19:37:04.887 回答
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)))))
于 2011-02-18T15:07:59.880 回答
44

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

=LAST(G2:G9999)

我们可以通过以下方式使用两个函数INDEX()COUNT()获得最后一个单元格:

=INDEX(G2:G; COUNT(G2:G))

在电子表格中有一个活生生的例子,我发现(并解决了)同样的问题(工作表Orzamentos、单元格I5)。请注意,即使参考文档中的其他工作表,它也能完美运行。

于 2012-11-13T07:21:49.410 回答
38

概括:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

细节:

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

=INDEX(G2:G; COUNT(G2:G))

如果你有空白,它会失败。

您可以通过从更改为COUNT来处理一个空白COUNTA (参见user3280071 的答案):

=INDEX(G2:G; COUNTA(G2:G))

但是,对于某些空白组合,这将失败。(1 blank 1 blank 1对我来说失败了。)

以下代码有效(参见纳德的回答杰森的评论):

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )

但这需要考虑您是要使用COLUMNS还是要使用ROWS给定的范围。

但是,如果COLUMNS替换为COUNTI 似乎得到了一个可靠的、无空白的实现LAST

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) ) 

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

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

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

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

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
于 2014-12-23T15:32:43.413 回答
9

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

=INDEX(G2:G; COUNTA(G2:G))
于 2014-02-06T14:52:29.683 回答
7

这个对我有用:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
于 2015-01-31T15:40:24.547 回答
7

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

假设您要在其中查找最后一个值的列是 B。

是的,它适用于空白。

于 2015-09-21T21:17:06.060 回答
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;
}

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

于 2011-11-27T01:42:18.693 回答
6

我看了以前的答案,他们似乎工作太努力了。也许脚本支持只是简单地改进了。我认为函数是这样表达的:

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

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

= lastValue(E17:E999)

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

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

于 2014-02-19T04:04:15.877 回答
5
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

没有硬编码。

于 2012-06-14T19:10:24.237 回答
5

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

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
于 2014-04-01T23:28:24.310 回答
4

在有空格的列中,您可以使用

=+sort(G:G,row(G:G)*(G:G<>""),)
于 2015-11-20T14:32:27.643 回答
4

答案

$ =INDEX(G2:G; COUNT(G2:G))

在 LibreOffice 中无法正常工作。但是,只需稍作改动,它就可以完美运行。

$ =INDEX(G2:G100000; COUNT(G2:G100000))

只有当真实范围小于(G2:G10000)

于 2015-12-30T20:33:36.080 回答
3

用严格的题外话回答原始问题是否可以接受:) 您可以在电子表格中编写一个公式来执行此操作。也许丑?但在电子表格的正常操作中有效。

=indirect("R"&ArrayFormula(max((G:G<>"")*row(G:G)))&"C"&7)


(G:G<>"") gives an array of true false values representing non-empty/empty cells
(G:G<>"")*row(G:G) gives an array of row numbers with zeros where cell is empty
max((G:G<>"")*row(G:G)) is the last non-empty cell in G

这是对脚本领域中一系列问题的思考,这些问题可以通过数组公式可靠地传递,这些公式具有在 excel 和 openoffice中经常以类似方式工作的优势。

于 2012-08-09T05:09:20.450 回答
3
function getDashboardSheet(spreadsheet) {
  var sheetName = 'Name';
  return spreadsheet.getSheetByName(sheetName);
}
      var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);  
      var dashboardSheet = getDashboardSheet(spreadsheet);
      Logger.log('see:'+dashboardSheet.getLastRow());
于 2015-12-13T20:34:34.000 回答
3

我正在使用@tinfini 给出的代码,并认为人们可能会从我认为稍微优雅的解决方案中受益(请注意,当他创建原始答案时,我认为脚本的工作方式并不完全相同)......

//Note that this function assumes a single column of values, it will 
//not  function properly if given a multi-dimensional array (if the 
//cells that are captured are not in a single row).

function LastInRange(values) 
{
  for (index = values.length - 1; values[index] == "" && index > 0; index--) {}
  return String(values[index]);
}

在使用中,它看起来像这样:

=LastInRange(D2:D)
于 2017-01-12T23:29:27.787 回答
2

我找到了另一种方法可能会帮助你

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )- 将返回最后一行

来自 anab 的更多信息: https ://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI

于 2012-10-24T06:31:43.267 回答
2

关于@Jon_Schneider 的评论,如果该列有空白单元格,只需使用COUNTA()

=INDEX(G2:G; COUNT**A**(G2:G))
于 2013-10-08T12:27:03.290 回答
2

发现了一个细微的变化,可以消除表格底部的空白。=index(G2:G,COUNTIF(G2:G,"<>"))

于 2018-07-20T16:12:28.827 回答
1

我很惊讶以前没有人给出过这个答案。但这应该是最短的,甚至可以在 excel 中使用:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>""创建一个由 1/true(1) 和 1/false(0) 组成的数组。由于LOOKUP采用自上而下的方法来查找2并且由于它永远不会找到 2,因此它会到达最后一个非空白行并给出它的位置。

正如其他人可能提到的那样,另一种方法是:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

找到非空白行的MAXimum并将其提供给ROWINDEX

在零空白中断数组中,使用INDIRECT RC符号 withCOUNTBLANK 是另一种选择。如果 V4:V6 被条目占用,那么,

V18

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

将给出V6的位置。

于 2017-09-28T13:04:34.010 回答
1

要从列中获取最后一个值,您还可以将MAX函数与IF函数 一起使用

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
于 2019-07-13T05:54:27.963 回答
1

对于特定列,我已经经历了太多最后一行的实现。许多解决方案都有效,但对于大型或多个数据集来说速度很慢。我的一个用例要求我检查多个电子表格中特定列的最后一行。我发现将整个列作为一个范围然后迭代它太慢了,并且将其中的一些加在一起会使脚本变得迟缓。

我的“hack”是这个公式:

=ROW(index(sheet!A2:A,max(row(sheet!A2:A)*(sheet!A2:A<>""))))-1
  • 示例:将此添加到单元格 A1,以查找 A 列中的最后一行。可以添加到任何地方,只需确保根据放置公式的行来管理末尾的“-1”。您也可以将其放置为另一个列,而不是您要计数的列,并且您不需要管理 -1。您还可以从起始行开始计数,例如“C16:C” - 将从 C16 开始计数值

  • 这个公式可靠地给了我最后一行,包括数据集中间的空白

  • 要在我的 GS 代码中使用这个值,我只是从 A1 读取单元格值。我知道谷歌很清楚像读/写这样的电子表格功能很繁重(耗时),但这比我的经验中的列计数最后一行方法快得多(对于大型数据集)

  • 为了提高效率,我在 col 中获取最后一行,然后将其保存为全局变量并在我的代码中递增以跟踪我应该更新哪些行。每次循环需要进行更新时读取单元格的效率太低了。读取一次,迭代值,A1 单元格公式(上图)正在“存储”更新的值以供下次函数运行

如果这对您有帮助,请告诉我!如果我遇到任何问题,我会对此答案发表评论。

于 2020-09-29T20:06:53.777 回答