选择列的最后一个值


Answers:


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

用法:

=lastValue("G")

编辑:

响应评论,要求功能自动更新:

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

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

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

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


5
这是一个Google Spreadsheet脚本。您可以在Tools -> Scripts -> Script editor...
tinifni 2010年

1
:O那太神奇了!我不知道Google已经实现了脚本。非常感谢您,它工作得非常好
cambraca

1
知道如何在更改工作表中的数据时使其自动更新吗?
cambraca

我用一些应该有用的信息编辑了答案。编码愉快!
tinifni

5
我做了一个编辑这个脚本,你可以通过一个名为张成像lastValue(“工作表Sheet1!A”)gist.github.com/2701061
johnwards

165

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

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

12
只要数据集中没有空白,这似乎就起作用了
Keith Sirmons 2013年

另一个不错的资源是在productforums.google.com/forum/#!topic/docs/p3t3feg7Jic上选择的答案,该答案显示了如何获得FILTER()ed范围中的第一行,最后一行或第n行,类似于@Geta的答案
亚伦·布伦库什

这个答案stackoverflow.com/a/8161172/418111具有支持空白单元格的公式。
丹尼尔(Daniel)

8
正如@KeithSirmons提到的。如果您的列中有空格,则该空格将不起作用,因为它COUNT(G2:G)返回0。相反,请使用COUNTA(G2:G)那只计算数据集中值的数量。COUNTAINDEX当两个值之间没有一个空格时,才与结合使用以获取最后一个值。
Christiaan Westerbeek

3
另请注意,如果您的值不是数字,则需要COUNTACOUNT仅计算数值:给定文本单元格时将返回0。
航空

53

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

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

看起来像这样:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))

2
哇,这真干净。您能确切解释一下它是如何工作的吗?
cambraca 2011年

并非如此:只是在对源范围进行排序时才是正确的。
caligari

5
说明:ROW返回行号,因此FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )返回所有非空白行号(不是它们的值)的数组,例如[1,2,3,7,12,14]。然后MAX给我们最后一行。FILTER然后应用一秒钟来筛选出所有行号与该值不匹配的所有行MAX(即最后一个非空白行的值)。
jhabbott

ROW的两个实例都可以用COLUMN替换,以便返回特定行中的最后一个值(而不是特定列中的最后一个值)。
乔恩·施耐德

2
如果我只想要列的最后一个值的行号怎么办?
Nick5a1

44

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

=LAST(G2:G9999)

我们可以使用INDEX()COUNT()这两个函数来获取最后一个单元格:

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

在spreedsheet上有一个实时示例,我发现(并解决了)相同的问题(sheet Orzamentos,cell I5)。请注意,即使参考文档中的其他图纸,它也可以正常工作。


1
这很好用,并且可以在工作表更改时自动更新。谢谢!
TinaMarie 2012年

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

COUNTA如果您确定列中的值之间没有单个空格,则可以使用@JonSchneider 。查看我对dohmoose答案的评论。
Christiaan Westerbeek 2015年

为什么:G表示最后一个元素?有记录吗?
flow2k

33

摘要:

=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对我来说失败。)

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

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

但它需要考虑是要使用COLUMNS还是ROWS要在给定范围内使用。

但是,如果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) )

超级有用,可逐步完成每个迭代的步骤和功能+限制。我需要获取每一行的最后一个值,其中一些带有多个空格。这就像一个魅力。谢谢!
克里斯蒂安·亚当斯

9

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

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

1
但前提是您的价值观之间没有一个空白。如果存在,则 COUNTA与组合INDEX将不会返回列中的最后一个值。
Christiaan Westerbeek 2015年

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

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


6

我看着前面的答案,他们似乎在努力工作。也许脚本支持已经得到了改善。我认为函数是这样表达的:

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

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

= lastValue(E17:E999)

在函数中,我得到了一个值数组,每个引用的单元格都有一个,这只是从数组末尾向后迭代,直到找到一个非空值或元素用完为止。在将数据传递给函数之前,应先解释图纸引用。也没有足够的花样来处理多维。这个问题确实要求在单个列中的最后一个单元格,因此似乎很合适。如果您也用完了数据,它可能也会消失。

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


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

没有硬编码。


5

这对我有用:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))

一个不错的解决方案,它也可以在有空单元的情况下工作。
jochen 2015年

5

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

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

也适用于列。我只是替换了几件事。=INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
杰森

通用解决方案:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
杰森

对我来说,这是“正确”的答案。合理紧凑且易于理解,可与空白一起使用。
aardvarkk

4

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

=+sort(G:G,row(G:G)*(G:G<>""),)

一个不错的解决方案。我怀疑@Pedro的变体(使用INDEX和MAX)可能比使用SORT效率更高。
jochen

4

答案

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

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

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

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


这篇文章被标记为“ Google Spreadsheet”和“ Google Apps Script”,与Libre Office无关...您不在话题上
Serge insas 2015年

问题的标题“ 选择列的最后一个值”并不是很遥远,某些可怜的人可以使用LibreOffice或Numbers轻松找到。我是一个电子表格爱好者,他知道足够危险。我可以收集到的是Google做到了这一点,因此,如果您对范围的第二个参数只是一列,它将选择该列的其余部分,因此人们不必使用您发现的大量骇客。
亚伦

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


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());

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)

2

关于@Jon_Schneider的注释,如果该列具有空白单元格,则使用COUNTA()

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

4
不,那也不行。COUNT和COUNTA之间的区别在于数字和文本之间的区别,此处无关紧要。
mhsmith 2014年

2

我发现另一种方式可能会帮助您

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

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


1
并非如此:只是在对源范围进行排序时才是正确的。
caligari 2012年

2

发现轻微的变化可以消除表格底部的空白。= index(G2:G,COUNTIF(G2:G,“ <>”))


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 ROW非空行并将其进料INDEX

在零空白中断数组中,将INDIRECT RC符号与一起使用COUNTBLANK 是另一种选择。如果V4:V6被条目占据,则,

V18

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

将给出V6的位置。


1

要从列中获取最后一个值,您还可以使用MAXfunction with IFfunction

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.