1

使用“lastRow”可以获得工作表中的最后一行。有时您需要特定列的最后一行。Google Apps 脚本不提供此功能。网站上已经有大约 5 个问题和解决方案,但都包含一些特定的代码。

我采用了我认为在大多数情况下最快的解决方案-您开始查看工作表的末尾并在您指定的列中向后看-并从中创建了一个干净的功能。

所以这是初学者复制粘贴这个的贡献 - 参数“RowNumber”是您要查看为数字的列:0 是 A,1 是 B,2 是 C 等。函数返回最后一行作为数字(“4”)

因为我是第 3 天的应用程序脚本用户,所以我的问题是:如果这不是最快和最干净的方法,或者脚本在某些情况下无法正常工作,请告诉我。对于我的用例,它完美无缺。

function getLastColumnRow(RowNumber, sheet) {
  var data = sheet.getDataRange().getValues();
  var numRows = data.length;

 // loop from bottom to top for last row in given row "RowNumber"
  while( data[numRows - 1][RowNumber] == "" && numRows > 0 ) {
    numRows--;
  }
  return numRows
}
4

2 回答 2

1

有更快的方法可以做到这一点并且消耗更少的 api 数据:1)您可以使用二进制搜索而不是循环所有行。确保您的色谱柱上没有孔,这样才能正常工作。2)您可以通过执行 getRange ("a1:a") 仅获取列而不是整个范围,但是您需要根据所需的列构造该范围字符串

您可以结合 1 和 2 欢呼

于 2013-05-27T00:20:27.217 回答
1

您的代码只有一个小错误,您应该使用===运算符而不是==. 因为您将“0”值视为空。如果您不知道它们之间的区别,请尝试快速搜索以了解更多信息。

奇怪的是,您将保存列号的变量命名为“RowNumber”,为什么不命名为“columnNumber”?这对我来说更有意义。

我通常尝试在所有脚本上做的另一件事是减少 API 调用。搜索后我需要其他地方的数据是很常见的。所以,如果这个函数直接接受数据而不是工作表对象会很好。或者也许是其中之一。

最后,它可能并没有太大的区别,但是您可以通过少开始一个循环来减少每个循环的减法。

将我的评论付诸实践,这是生成的代码:

function getLastRowOfColumn(columnNumber, optData, optSheet) {
  var data = optData !== null ? optData : optSheet.getDataRange().getValues();
  var row = data.length-1;
  for( ; row > 0 && data[row][columnNumber] === ''; --row ) ;
  return row+1;
}

对我们的两个代码的警告,我们只是通过检查单元格值来考虑空白。它可能有一个公式,根据定义,这意味着单元格不是空白的,即返回一个空字符串。例如

=IF(A1="Some comparison that returns false"; "really?"; "")

于 2013-05-25T15:36:40.477 回答