选择列的最后一个值

google-apps-script google-sheets google-sheets-formula array-formulas custom-function

95620 观看

22回复

17669 作者的声誉

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

就像是:

=LAST(G2:G9999)

除了这LAST不是一个功能。

作者: cambraca 的来源 发布者: 2010 年 11 月 12 日

回应 (22)


53

2139 作者的声誉

决定

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

脚本:

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()并强制更新单元格函数。我只是在文档中找不到它。

作者: tinifni 发布者: 18.11.2010 07:37

52

529 作者的声誉

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

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)))))
作者: Getas 发布者: 18.02.2011 03:07

5

51 作者的声誉

看起来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脚本帮助论坛中的讨论:如何强制重新计算公式?

作者: craig3353 发布者: 27.11.2011 01:42

4

41 作者的声誉

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

没有硬编码。

作者: desnyki 发布者: 14.06.2012 07:10

2

1094 作者的声誉

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

=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中以类似方式工作的优点。

作者: DavidF 发布者: 09.08.2012 05:09

1

307 作者的声誉

我发现另一种方式可能会对你有所帮助

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

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

作者: irriss 发布者: 24.10.2012 06:31

42

1897 作者的声誉

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

=LAST(G2:G9999)

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

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

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

作者: caligari 发布者: 13.11.2012 07:21

162

1652 作者的声誉

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

=INDEX(G2:G, COUNT(G2:G))
作者: dohmoose 发布者: 14.12.2012 12:41

1

27 作者的声誉

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

=INDEX(G2:G; COUNT**A**(G2:G))
作者: pedro 发布者: 08.10.2013 12:27

8

81 作者的声誉

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

=INDEX(G2:G; COUNTA(G2:G))
作者: user3280071 发布者: 06.02.2014 02:52

5

311 作者的声誉

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

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

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

= lastValue(E17:E999)

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

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

作者: Ted H. 发布者: 19.02.2014 04:04

4

3890 作者的声誉

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

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
作者: Nader 发布者: 01.04.2014 11:28

28

762 作者的声誉

摘要:

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

细节:

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

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

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

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

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

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

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

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

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

但是,如果COLUMNS被替换为COUNT我似乎得到一个可靠的,空白的实现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) )
作者: Doug Bradshaw 发布者: 23.12.2014 03:32

4

41 作者的声誉

这个对我有用:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
作者: Pedro 发布者: 31.01.2015 03:40

6

410 作者的声誉

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

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

是的,它适用于空白。

作者: Andrew Anderson 发布者: 21.09.2015 09:17

4

12044 作者的声誉

在包含空格的列中,您可以获取最后一个值

=+sort(G:G,row(G:G)*(G:G<>""),)
作者: JPV 发布者: 20.11.2015 02:32

2

21 作者的声誉

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());
作者: Marian 发布者: 13.12.2015 08:34

3

41 作者的声誉

答案

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

在LibreOffice中无法正常工作。然而,通过一个小的改变,它完美地工作。

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

它始终只有在真实范围小于时才有效 (G2:G10000)

作者: Manuel Ferreira 发布者: 30.12.2015 08:33

2

31 作者的声誉

我正在玩@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)
作者: Jonathan Cavell 发布者: 12.01.2017 11:29

1

12996 作者的声誉

我很惊讶以前没有人给过这个答案。但这应该是最短的,它甚至可以在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 ROW并将其送入INDEX

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

V18

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

将给出V6的位置。

作者: TheMaster 发布者: 28.09.2017 01:04

1

11 作者的声誉

发现了一个微小的变化,可以消除桌子底部的空白。指数=(G2:G,COUNTIF(G2:G, “<>”))

作者: Chris 发布者: 20.07.2018 04:12

0

15660 作者的声誉

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

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
作者: player0 发布者: 13.07.2019 05:54
32x32