首页 > 解决方案 > Google表格:查找范围内的最后一行 - 自定义公式

问题描述

我一直在寻找谷歌表格的自定义函数,它可以找到最后一行有数据。

我希望能够给出一个范围并找到包含数据的最后一行,以及能够指定它将作为输出提供的列。

例如,在 A:A 范围内搜索其最后一行的条目,并从 C:D 返回同一行。在这种情况下,它将导致 [["cool","beans"]] 作为输出。

+---+--------+------+-------+------+
|   | A      | B    | C     | D    |
+---+--------+------+-------+------+
| 1 | Words  |      | Then  |      |
+---+--------+------+-------+------+
| 2 | and    | asd  | a     |      |
+---+--------+------+-------+------+
| 3 | things |      | thing | Yep  |
+---+--------+------+-------+------+
| 4 |        | here |       | Why? |
+---+--------+------+-------+------+
| 5 | stuff  |      | cool  | beans|
+---+--------+------+-------+------+
| 6 |        |      |       |      |
+---+--------+------+-------+------+

我找到了一些解决方案,但有些只允许检查单个列,没有很好地处理空白或需要使用引号,这意味着公式拖放功能丢失了。或者使用很长的函数组合,例如 this

我决定制作自己的自定义公式,您可以在下面查看我的解决方案。

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-formula

解决方案


我使用谷歌应用脚​​本创建了一个自定义函数。(在 Google 表格中:工具 --> 脚本编辑器)

如果我在某些情况下没有遵守约定,我向那里的专业人士道歉!我自学创造了这个。

它将检查给定范围并输出最后一行中的所有值,或者,如果指定,则输出给定范围的另一个范围/子集中的最终对应行。

示例用法: LASTROW(A:A,B:D) 将检查范围 A:A 的最终非空行,并返回 B:D 的相应行。

只要行数相等,这将起作用,例如。拉斯特罗(A1:A10,B21:B30)

/**
* Returns the last row in a range, can be single or multi-column.
*
*
* @param    {A1:A100}   range_to_check Range to find final row 
* and returns contents if no range_to_return is specified.
* @param    {[B1:E100]} range_to_return [optional] Range for row to be returned. 
* i.e if row 3 in range_to_check is final row, then row 3 in range_to_return will be returned.
* @customfunction
*/

function LASTROW(range_to_check,range_to_return) {
  // checks range_to_check for final row with non-empty entries
  // range_to_return is optional, will return final row of range_to_check if missing

  if (Array.isArray(range_to_check)) {                                                                                                                  
    // checks if input is a range/cell reference 
    // N.B: Google Apps Script parses a cell range as an array of values

    for (i=0;i<range_to_check.length;i++) {
      // For each row i, check if any columns are non-empty
      var final_column_in_row = undefined;

      for (j=0;j<range_to_check[i].length;j++) {
        if (range_to_check[i][j] !== '') {       
          final_column_in_row = j;
        }
      }
      if (final_column_in_row != undefined) {  // if any columns in row i are non-empty      
        var final_row = i; // set row i as final column
      }
    }
    if (final_row != undefined) {
      // if there exists a non-empty row

      if (range_to_return == undefined) {
        // and no range_to_return is specified

        return [range_to_check[final_row]];
        // return the final row of range_to_check

      } else {
        // if range_to_return is specified

        if (range_to_check.length == range_to_return.length) {
          // and both ranges have the same number of rows

          return [range_to_return[final_row]];
          // return the corresponding row from range_to_return
          // i.e if final row of range_to_check is 5, returns the 5th row of range_to_return

        } else {
          throw 'Ranges have different number of rows, or range_to_check is not an array.'
        }
      }
    } else {
      return null;
    }
  } else {
    throw 'range_to_check is not a range.';
  }

}

希望有人在那里找到一些用处:)


推荐阅读