Answers:
因此,此解决方案将字符串作为其参数。它查找工作表中有多少行。它获取指定列中的所有值。它从头到尾循环遍历这些值,直到找到不是空字符串的值。最后,它重新调整值。
脚本:
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()
并强制执行单元功能进行更新。我只是在文档中找不到它。
与caligari的答案类似,但是我们可以通过指定整个列范围来整理它:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
ed范围中的第一行,最后一行或第n行,类似于@Geta的答案。
COUNT(G2:G)
返回0。相反,请使用COUNTA(G2:G)
那只计算数据集中值的数量。COUNTA
仅INDEX
当两个值之间没有一个空格时,才与结合使用以获取最后一个值。
COUNTA
。COUNT
仅计算数值:给定文本单元格时将返回0。
实际上,我在这里找到了一个更简单的解决方案:
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)))))
ROW
返回行号,因此FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
返回所有非空白行号(不是它们的值)的数组,例如[1,2,3,7,12,14]。然后MAX
给我们最后一行。FILTER
然后应用一秒钟来筛选出所有行号与该值不匹配的所有行MAX
(即最后一个非空白行的值)。
为了选择范围内的最后一个单元,目前未实现LAST()函数。但是,按照您的示例:
=LAST(G2:G9999)
我们可以使用INDEX()和COUNT()这两个函数来获取最后一个单元格:
=INDEX(G2:G; COUNT(G2:G))
在spreedsheet上有一个实时示例,我发现(并解决了)相同的问题(sheet Orzamentos
,cell I5
)。请注意,即使参考文档中的其他图纸,它也可以正常工作。
COUNTA
如果您确定列中的值之间没有单个空格,则可以使用@JonSchneider 。查看我对dohmoose答案的评论。
:G
表示最后一个元素?有记录吗?
=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
将其替换为,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) )
为了从一列文本值中返回最后一个值,您需要使用COUNTA,因此需要以下公式:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
与组合INDEX
将不会返回列中的最后一个值。
看起来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脚本帮助论坛中的讨论:如何强制重新计算公式?
我看着前面的答案,他们似乎在努力工作。也许脚本支持已经得到了改善。我认为函数是这样表达的:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
然后在我的电子表格中使用:
= lastValue(E17:E999)
在函数中,我得到了一个值数组,每个引用的单元格都有一个,这只是从数组末尾向后迭代,直到找到一个非空值或元素用完为止。在将数据传递给函数之前,应先解释图纸引用。也没有足够的花样来处理多维。这个问题确实要求在单个列中的最后一个单元格,因此似乎很合适。如果您也用完了数据,它可能也会消失。
您的里程可能会有所不同,但这对我有用。
这将获取最后一个值并处理空值:
=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()))) ) ) )
答案
$ =INDEX(G2:G; COUNT(G2:G))
在LibreOffice中无法正常工作。但是,只需稍作更改,它就能完美运行。
$ =INDEX(G2:G100000; COUNT(G2:G100000))
仅当真实范围小于 (G2:G10000)
可以使用主题完全不正确的答案回答原始问题:)您可以在电子表格中编写公式来执行此操作。也许丑陋?但在电子表格的正常运行中有效。
=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中以类似的方式工作。
我正在使用@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)
关于@Jon_Schneider的注释,如果该列具有空白单元格,则使用COUNTA()
=INDEX(G2:G; COUNT**A**(G2:G))
我很惊讶以前没有人给出这个答案。但这应该是最短的,甚至可以在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)
寻找MAX
imum ROW
非空行并将其进料INDEX
在零空白中断数组中,将INDIRECT
RC
符号与一起使用COUNTBLANK
是另一种选择。如果V4:V6被条目占据,则,
V18:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
将给出V6的位置。
Tools -> Scripts -> Script editor...