题
我在G列中有一个具有一些值的电子表格。两者之间有些单元格,我需要将最后一个值从该列中获取到另一个单元格。
就像是:
=LAST(G2:G9999)
除了那个 LAST
不是功能。
解决方案
因此,该解决方案将字符串作为其参数。它发现表格中有多少行。它在指定的列中获取所有值。它从末端到开始循环,直到找到一个不是空字符串的值。最后,它重新调整了值。
脚本:
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()
并强制细胞功能更新。我只是在文档中找不到它。
其他提示
类似的答案 卡利加里的答案, ,但是我们可以通过指定完整的列范围来整理它:
=INDEX(G2:G, COUNT(G2:G))
实际上,我在这里找到了一个简单的解决方案:
http://www.google.com/support/forum/p/google+docs/thread?tid=20f1741a2e6663bca&hl=en
看起来像这样:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
目前尚未实现last()函数,以便在范围内选择最后一个单元格。但是,按照您的示例:
=LAST(G2:G9999)
我们能够使用几个功能获得最后一个单元格 指数() 和 数数() 这样:
=INDEX(G2:G; COUNT(G2:G))
有一个 现场示例 在我发现(并解决)相同问题的spreedsheet上 Orzamentos
, , 细胞 I5
)。请注意,它甚至可以完美地参考文档中的其他床单。
概括:
=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))
尝试这个:=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
假设您正在寻找最后值的列是B。
是的,它可以与空白一起使用。
看起来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)
在该函数中,我得到一个值的数组,每个引用单元格一个值,这只是从数组的末端向后迭代,直到它找到非空值或运行元素。在将数据传递给函数之前,应解释表参考。也不足以处理多维。这个问题确实要求单列中的最后一个单元格,因此似乎合适。如果您也用完数据,它可能会死亡。
您的里程可能会有所不同,但这对我有用。
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
没有硬编码。
这个对我有用:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
这获得了最后一个值并处理空值:
=INDEX( FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
在带有空白的列中,您可以获得最后一个值
=+sort(G:G,row(G:G)*(G:G<>""),)
答案
$ =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的时尚。
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());
我正在玩@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))
我发现另一种方式可能会帮助您
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- 将返回最后一行
来自Anab的更多信息:https://groups.google.com/forum/?fromgroups=# !! topic/how-to-documents/if0_fgvinmi
发现了一个轻微的变化,可以从表底部消除空白。 = index(g2:g,countif(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的位置。
要从列获取最后一个值,您也可以使用 MAX
功能 IF
功能
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))