代码之家  ›  专栏  ›  技术社区  ›  cambraca

选择列的最后一个值

  •  107
  • cambraca  · 技术社区  · 14 年前

    我有一个电子表格,在G列中有一些值。其中一些单元格是空的,我需要将最后一个值从该列获取到另一个单元格中。

    类似于:

    =LAST(G2:G9999)
    

    除了那个 LAST 不是函数。

    21 回复  |  直到 5 年前
        1
  •  54
  •   tinifni    14 年前

    所以这个解决方案使用一个字符串作为参数。它查找工作表中有多少行。它获取指定列中的所有值。它从头到尾循环遍历值,直到找到一个不是空字符串的值。最后它会重新显示值。

    脚本:

    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() 并强制单元函数更新。我只是在文件里找不到。

        2
  •  165
  •   Kos Tamilselvan Sellamuthu    7 年前

    类似于 caligari's answer ,但我们可以通过指定完整的列范围来整理它:

    =INDEX(G2:G, COUNT(G2:G))
    
        3
  •  53
  •   Stagr.Lee    10 年前

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

    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)))))
    
        4
  •  43
  •   Kos Tamilselvan Sellamuthu    7 年前

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

    =LAST(G2:G9999)
    

    我们可以用这两个函数得到最后一个单元格 索引() 计数() 以这种方式:

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

    有一个 live example 在我发现(并解决)同一个问题的进度表上 Orzamentos ,单元格 I5 ). 请注意,即使参考文档中的其他页,它也能完美地工作。

        5
  •  32
  •   Kos Tamilselvan Sellamuthu    7 年前

    总结:

    =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 在一定范围内。

    但是,如果 被替换为 计数 我似乎得到了 LAST :

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

    从那以后 伯爵 内置了过滤器,我们可以进一步简化使用

    =索引(筛选器(G2:G,而不是(ISBLANK(G2:G)),COUNTA(G2:G))
    

    这有点简单,而且是正确的。您不必担心是要计算行还是列。与脚本解决方案不同,它会随着电子表格的更改而自动更新。

    如果要获取行中的最后一个值,只需更改数据范围:

    =INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
    
        6
  •  9
  •   user3280071    11 年前

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

    =INDEX(G2:G; COUNTA(G2:G))
    
        7
  •  7
  •   Andrew Anderson    9 年前

    试试这个: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

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

    是的,可以用空白的。

        8
  •  6
  •   craig3353    13 年前

    看起来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;
    }
    

    另请参见谷歌应用程序脚本帮助论坛中的讨论: How do I force formulas to recalculate?

        9
  •  6
  •   Ted H.    11 年前

    我看了前面的答案,他们好像工作太辛苦了。或许脚本支持已经得到了简单的改进。我认为函数的表达方式如下:

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

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

    = lastValue(E17:E999)
    

    在函数中,我得到一个值数组,每个引用的单元格有一个值,这个数组从数组的末尾向后迭代,直到找到一个非空值或元素用完为止。在将数据传递给函数之前,应解释表引用。也没有足够的想象力来处理多维空间。这个问题确实要求在一个列中找到最后一个单元格,所以看起来很合适。如果数据也用完了,它可能会死掉。

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

        10
  •  5
  •   DaveShaw Thishin    12 年前
    function lastRow(column){
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var lastRow = sheet.getLastRow();
      var lastRowRange=sheet.getRange(column+startRow);
      return lastRowRange.getValue();
    }
    

    没有硬编码。

        11
  •  5
  •   Pedro    10 年前

    这个对我有用:

    =INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
    
        12
  •  5
  •   Kos Tamilselvan Sellamuthu    7 年前

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

    =INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
    
        13
  •  4
  •   JPV    9 年前

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

    =+sort(G:G,row(G:G)*(G:G<>""),)
    
        14
  •  4
  •   User1000547 shiyani suresh    9 年前

    答案

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

    在图书馆工作不正常。不过,只要稍作改动,它就可以完美工作。

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

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

        15
  •  3
  •   DavidF    12 年前

    是否可以用严格的非主题答案回答原始问题:) 可以在电子表格中编写公式来完成此操作。也许很丑?但在电子表格的正常操作中有效。

    =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中流行。

        16
  •  3
  •   Marian    9 年前
    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());
    
        17
  •  3
  •   Jonathan Cavell    8 年前

    我在玩@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)
    
        18
  •  2
  •   pedro    11 年前

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

    =INDEX(G2:G; COUNT**A**(G2:G))
    
        19
  •  2
  •   Kos Tamilselvan Sellamuthu    7 年前

    我找到了另一种方法也许它会帮你

    =INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )

    anab提供的更多信息如下: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI

        20
  •  2
  •   Chris    6 年前

    发现了一个微小的变化,可以消除桌子底部的空白。 =索引(G2:G,COUNTIF(G2:G,“<”)

        21
  •  1
  •   Kos Tamilselvan Sellamuthu    7 年前

    我很惊讶以前从来没有人给出过这个答案。但这应该是最短的,它甚至可以在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 伊姆 ROW 非空白行的 INDEX

    在零空白中断阵列中,使用 INDIRECT RC 符号 COUNTBLANK 是另一种选择。如果V4:V6被条目占用,那么,

    第18版 :

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

    将给出V6的位置。

        22
  •  1
  •   player0    5 年前

    要从列中获取最后一个值,还可以使用 MAX 功能 IF 功能

    =ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))