我有一个电子表格,其中列G中有一些值。有些单元格之间是空的,我需要将该列中的最后一个值放到另一个单元格中。
类似的东西:
=LAST(G2:G9999)
除了LAST
不是函数。
答案 0 :(得分:161)
caligari's answer的类似答案,但我们可以通过指定完整的列范围来整理它:
=INDEX(G2:G, COUNT(G2:G))
答案 1 :(得分:53)
所以这个解决方案以字符串作为参数。它会查找工作表中有多少行。它获取指定列中的所有值。它循环遍历从结尾到开头的值,直到找到不是空字符串的值。最后它重新调整了价值。
<强>脚本:强>
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"));
}
不再需要在 Usage 部分状态的单元格中使用该功能。相反,您正在对要更新的单元格以及要跟踪的列进行硬编码。有可能有一种更有说服力的方式来实现它(希望是一种非硬编码的方式),但这是我现在能找到的最好的方法。
请注意,如果您使用前面所述的单元格中的函数,它将在重新加载时更新。也许有一种方法可以挂钩onEdit()
并强制更新单元格函数。我只是在文档中找不到它。
答案 2 :(得分:52)
实际上我在这里找到了一个更简单的解决方案:
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)))))
答案 3 :(得分:42)
目前尚未实现LAST()函数,以便选择范围内的最后一个单元格。但是,按照你的例子:
=LAST(G2:G9999)
我们能够以这种方式使用 INDEX()和 COUNT()这两个函数获取最后一个单元格:
=INDEX(G2:G; COUNT(G2:G))
spreedsheet上有一个 live example ,我找到(并解决了)同样的问题(工作表Orzamentos
,单元格I5
)。请注意,它甚至可以完美地引用文档中的其他工作表。
答案 4 :(得分:27)
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
我已经查看并尝试了几个答案,以下是我发现的内容: 如果没有空白,最简单的解决方案(参见Dohmoose' answer)就可以了:
=INDEX(G2:G; COUNT(G2:G))
如果你有空白,那就失败了。
只需从COUNT
更改为COUNTA
即可处理一个空白(请参阅user3280071's answer):
=INDEX(G2:G; COUNTA(G2:G))
但是,对于某些空白组合,这将失败。 (1 blank 1 blank 1
对我失败。)
以下代码有效(请参阅Nader's answer和jason's comment):
=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) )
答案 5 :(得分:7)
要从一列文本值返回最后一个值,您需要使用COUNTA,因此您需要以下公式:
=INDEX(G2:G; COUNTA(G2:G))
答案 6 :(得分:6)
试试这个:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
假设您要查找最后一个值的列是B。
是的,它适用于空白。
答案 7 :(得分:5)
看起来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脚本帮助论坛中的讨论:How do I force formulas to recalculate?
答案 8 :(得分:5)
我看了之前的答案,看起来他们的工作太辛苦了。也许脚本支持只是改进了。我认为函数表达如下:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
在我的电子表格中,我然后使用:
= lastValue(E17:E999)
在函数中,我得到一个值数组,每个引用的单元格一个,这只是从数组的末尾向后迭代,直到找到非空值或用完元素。在将数据传递给函数之前,应解释表引用。也不足以处理多维度。问题确实要求在一个列中的最后一个单元格,所以它似乎适合。如果你的数据用完了,它可能会死掉。
您的里程可能会有所不同,但这对我有用。
答案 9 :(得分:4)
这将获取最后一个值并处理空值:
=INDEX( FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
答案 10 :(得分:4)
在包含空格的列中,您可以使用
获取最后一个值=+sort(G:G,row(G:G)*(G:G<>""),)
答案 11 :(得分:4)
这个适用于我:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
答案 12 :(得分:4)
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
没有硬编码。
答案 13 :(得分:3)
答案
$ =INDEX(G2:G; COUNT(G2:G))
在LibreOffice中无法正常工作。但是,只需稍加改动,它就能完美运行。
$ =INDEX(G2:G100000; COUNT(G2:G100000))
只有在真实范围小于(G2:G10000)
答案 14 :(得分:2)
用严格的主题答案回答原始问题是否可以接受:) 您可以在电子表格中编写公式来执行此操作。丑陋或许?但在电子表格的正常操作中有效。
=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中以类似方式工作的优势。
答案 15 :(得分:2)
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());
答案 16 :(得分:2)
我正在玩@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)
答案 17 :(得分:1)
关于@ Jon_Schneider的评论,如果列中有空白单元格,只需使用 COUNTA()
=INDEX(G2:G; COUNT**A**(G2:G))
答案 18 :(得分:1)
我发现另一种方式可能会对你有所帮助
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- 将返回最后一行
来自anab的更多信息: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
答案 19 :(得分:1)
=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)
查找非空白行的MAX
imum ROW
并将其提供给INDEX
在零空白中断数组中,对INDIRECT
使用RC
COUNTBLANK
表示法是另一种选择。如果V4:V6被条目占用,则
<强> V18 强>:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
将给出V6的位置。
答案 20 :(得分:1)
找到了一个细微的变化,可以消除桌子底部的空白。 = index(G2:G,COUNTIF(G2:G,“ <>”))
答案 21 :(得分:1)
要从列中获取最后一个值,您还可以将MAX
函数与IF
函数一起使用
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
答案 22 :(得分:0)
对于特定的列,我已经经历了太多的最后一行的这些实现。许多解决方案都可以使用,但是对于大型或多个数据集来说速度很慢。我的一个用例要求我检查多个电子表格中特定列的最后一行。我发现,将整个列作为一个范围,然后对其进行迭代太慢了,将其中一些加在一起会使脚本变慢。
我的“ hack”就是这个公式:
=ROW(index(sheet!A2:A,max(row(sheet!A2:A)*(sheet!A2:A<>""))))-1
示例:将其添加到单元格A1中,以查找列A中的最后一行。可以添加到任何位置,只需确保根据公式放在哪一行的末尾来管理“ -1”即可。您还可以将其放置在另一个列中,而不是要尝试计数的列中,并且不需要管理-1。您也可以从起始行开始计数,例如“ C16:C”-将从C16开始计数值
该公式可靠地给了我最后一行,包括数据集中间的空白
要在我的GS代码中使用此值,我只是从A1中读取单元格值。我了解Google很清楚,电子表格功能(例如读/写)很繁琐(耗时),但是根据我的经验(对于大型数据集),这比列数最后一行方法要快得多
为提高效率,我在col中获取了最后一行,然后将其保存为全局变量,并在代码中递增以跟踪应更新的行。每次循环需要进行更新时都读取单元格会导致效率低下。读取一次,迭代该值,A1单元格公式(如上)将“存储”更新的值,以供下次函数运行时使用
请告诉我这是否对您有帮助!如果遇到任何问题,我会对此答案发表评论。