5

我对 getLastRow() 有疑问。我认为这个函数应该返回有数据的最后一行。但是由于我正在处理的工作表在填充数据的行下方有更多空行,因此这些函数似乎会进入并选择其执行时的最后一个空行,而不是选择具有数据的最后一行,这可能不会是相同的。有人可以告诉我如何解决这个异常。这是谷歌脚本错误还是我不清楚该怎么做?如果我没有说清楚,请提出进一步的问题。

4

4 回答 4

10

工作表中是否有任何“整列”公式?是数组公式,还是一直向下复制的公式?即使这些公式旨在返回底部的空白单元格,getLastRow()仍然会捕获它们。

如果是这种情况,请尝试:

function getLastPopulatedRow(sheet) {
  var data = sheet.getDataRange().getValues();
  for (var i = data.length-1; i > 0; i--) {
    for (var j = 0; j < data[0].length; j++) {
      if (data[i][j]) return i+1;
    }
  }
  return 0; // or 1 depending on your needs
}
于 2012-06-04T22:21:10.950 回答
2

这是当前所选答案的另一个版本。这将内部循环换成数组连接,项目之间没有空格。这将连接行上的所有字符。如果在任何位置有角色,它将与当前答案相似。

我做了一些速度测试,虽然我认为选择的答案可能会更快,但由于某种原因,根据我的测试,这似乎处理得更快。我相信几年前我在堆栈溢出时发现了这个概念,但现在没有看到那个参考。

function getLastPopulatedRow(sheetX) {
  var arrVals = sheetX.getDataRange().getValues();
  for (var i = arrVals.length-1; i > 0; i--) {
    if (arrVals[i].join('')){
      return i+1
    }
  }
  return 0; 
}
于 2019-10-25T14:31:31.987 回答
1

更简单的方法是

var lastRow = sheet.getDataRange().getValues().length ;
于 2012-06-05T06:01:56.620 回答
-1

虽然亚当斯的解决方案可以进行一些调整,但我通过一些搜索找到了解决这个问题的另一种解决方案。我看到了一个应该找到第一个空行的代码,我想我可以简单地返回第一个空行后面的行来获取最后一个填充的行。我在这里附上代码:

function getLastPopulatedRow(sheet) {
  var cell = sheet.getRange('a1');
  var ct = 0;
  while ( cell.offset(ct, 0).getValue() != "" ) {
    ct++;
  }
  return (ct--);
}
于 2012-06-05T19:35:45.847 回答