Google apps script 选择列的最后一个值

Google apps script 选择列的最后一个值,google-apps-script,google-sheets,google-sheets-formula,array-formulas,custom-function,Google Apps Script,Google Sheets,Google Sheets Formula,Array Formulas,Custom Function,我有一个电子表格,G列中有一些值。其中一些单元格是空的,我需要将该列中的最后一个值放入另一个单元格 比如: =LAST(G2:G9999) 除了LAST不是一个函数。所以这个解决方案采用字符串作为参数。它查找工作表中的行数。它获取指定列中的所有值。它从头到尾循环遍历这些值,直到找到一个不是空字符串的值。最后,它重新计算值 脚本: function lastValue(column) { var lastRow = SpreadsheetApp.getActiveSheet().getMax

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

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

看起来是这样的:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}
=LastInRange(D2:D)

看起来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;
}
另请参见谷歌应用程序脚本帮助论坛中的讨论:


没有硬编码

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

=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
=间接(“R”和数组公式(最大((G:G))*行(G:G)))和“C”和7)
(G:G“”)给出表示非空/空单元格的真-假值数组
(G:G“”)*行(G:G)给出了单元格为空的带有零的行号数组
max((G:G“”)*行(G:G))是G中最后一个非空单元格

这是为脚本领域中的一系列问题提供的一种思路,这些问题可以通过数组公式可靠地传递,数组公式的优点是在excel和openoffice中经常以类似的方式工作。

我发现另一种方法可能会对您有所帮助

=索引(排序(A5:D;1;FALSE);1)
-将返回最后一行

来自anab的更多信息,请点击此处:

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

=LAST(G2:G9999)
我们可以通过以下方式使用一对函数INDEX()COUNT()获取最后一个单元格:

=INDEX(G2:G; COUNT(G2:G))
在spreedsheet上有一个,我在那里发现(并解决)了相同的问题(sheet
Orzamentos
,cell
I5
)。请注意,即使参考文档中的其他页,它也能完美地工作。

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

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

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


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

=INDEX(G2:G; COUNTA(G2:G))
=ROW(index(sheet!A2:A,max(row(sheet!A2:A)*(sheet!A2:A<>""))))-1

我看了前面的答案,他们似乎工作太努力了。也许脚本支持只是有所改进。我认为函数是这样表达的:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}
=LastInRange(D2:D)
在我的电子表格中,我使用:

= lastValue(E17:E999)
在函数中,我得到一个值数组,每个被引用的单元格有一个值,它只是从数组的末尾向后迭代,直到找到一个非空值或元素用尽为止。应在将数据传递给函数之前解释图纸引用。也没有足够的想象力来处理多维问题。这个问题确实要求在一列中填写最后一个单元格,因此它似乎是合适的。如果您的数据也用完了,它也可能会死掉


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

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

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
总结: 细节: 我仔细阅读并尝试了几个答案,以下是我的发现: 如果没有空格,最简单的解决方案(请参阅)有效:

=INDEX(G2:G; COUNT(G2:G))
如果您有空格,它将失败

只需将
COUNT
更改为
COUNTA
,即可处理一个空白(请参阅):

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

以下代码起作用(请参阅和):

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

但是,如果将
替换为
计数
我似乎得到了可靠的
最后一个
的空白证明实现:

=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) )
这有点简单,而且正确。而且您不必担心是否要计算行或列。与脚本解决方案不同,它会随着电子表格的更改而自动更新

=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
如果要获取行中的最后一个值,只需更改数据范围:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
这个对我很有用:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
=索引(I:I;MAX((I:I“”)*(行(I:I)))
试试这个:
=间接(“B”和数组公式(最大((B3:B))*行(B3:B)))

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


是的,它适用于空格。

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

=+sort(G:G,row(G:G)*(G:G<>""),)
=+排序(G:G,行(G:G)*(G:G“”),)
答案

$ =INDEX(G2:G; COUNT(G2:G))
在LibreOffice中无法正常工作。然而,只要稍作改动,它就能完美地工作

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

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

时,它才会起作用。我当时正在使用@tinfini给出的代码,我认为人们可能会从中受益
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
=ROW(index(sheet!A2:A,max(row(sheet!A2:A)*(sheet!A2:A<>""))))-1