【问题标题】:Find LastRow of column C (when Col A and B have a different row size)?查找 C 列的最后一行(然后 A 列和 B 列具有不同的行大小)?
【发布时间】:2014-09-26 09:32:03
【问题描述】:

如何找到C列最后使用的单元格?

示例:“Sheet1”:“Col A”和“Col B”有 1200 行。而“Col C”只有 1 行。

## ColA  ColB   ColC
##    1     1      1
##    2     2   empty
## ..    ..     ..
## 1200  1200   empty

这是我失败的测试:

Function find_last_row_other_column() {
var ws_sheet =
var ws = SpreadsheetApp.openById("Dy...spreadsheet_id...4I")
var ws_sheet = ws1.getSheetByName("Sheet1");

var lastRow = ws_sheet.getRange("C").getLastRow();
var lastRow = ws_sheet.getRange("C:C").getLastRow();
var lastRow = ws_sheet.getRange(1,3,ws_sheet.getLastRow());  1200 rows for colA! instead of row = 1 for col C.
}

注意:我不能使用 C1,因为下次我使用该功能时,它将是 C1200 或其他东西。

var lastRow = ws_sheet.getRange("C1").getLastRow();

我问这个是因为我的下一个目标是将 C1 的结果复制/粘贴到 C2:C1200 中。这是我的测试:

var lastRow = ws_sheet.getLastRow();
var target_range = ws_sheet.getRange(1,3,lastRow,1); //C1 until last row
var Formula_values = source_range.getValues();
target_range.setValues(Formula_values);

提前致谢 ;)

ps:我花了 2 个小时在上面。我已经尝试过类似的问题和他们的解决方案已经在这个网站上给出,但我不能碰巧让他们工作。我搞不清楚了 ! : More efficient way too look up the last row in a specific column?Get last row of specific column function - best solution

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

正如我在上面的 cmets 中提到的,这是 StackOverFlow 上得分最高的帖子的主题...

原始帖子返回列中最后一个单元格的值,但(非常)小的修改使其返回行索引。

原帖:

Script:

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];
}

修改为返回列中最后使用的单元格的索引:

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 lastRow;
}

【讨论】:

  • 这很整洁!对不起,上面的过早评论。希望我能不止一次地支持你的答案!
  • 感谢 Serge(和 azawaza)。它就像一个魅力。我不够好,无法做出你所做的改变。那谢谢啦。 ;) 按照您的链接stackoverflow.com/questions/4169914/… 我添加了function onEdit(event) { SpreadsheetApp.getActiveSheet().getRange("F1").setValue(lastValue("C"));// } 再次感谢。 ;)
  • 你好,在上面的脚本之后,我也对第一列 developers.google.com/apps-script/articles/removing_duplicates 使用了这个 kill duplicate 脚本,唉,function onEdit(event) 运行时并不是所有的重复项都被删除。我还测试了在 F1 =lastValue("C") 中添加公式。它工作一次,但下次我添加更多行时,它不再工作了。任何的想法 ?提前致谢
  • 请开始一个新问题,清楚地说明您需要做什么。后续问题不清楚,对 S.O 用户不是很有用 - thx
  • 亲爱的未来访客,check this answer,恕我直言更干净。
【解决方案2】:

这是执行此操作的函数:

function lastRowInColumnLetter(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow() - 1; // values[] array index
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + (lastRow + 1)).getValues();
  while (lastRow > -1 && values[lastRow] == "") {
      lastRow--;
  }
  if (lastRow == -1) {
    return "Empty Column";
  } else {
    return lastRow + 1;
  }
}

然后您将其调用为=lastRowInColumnLetter("C")

在这种情况下,这里还有 3 个更有用的功能:

function lastValueInColumnLetter(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow() - 1; // values[] array index
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + (lastRow + 1)).getValues();
  while (lastRow > -1 && values[lastRow] == "") {
      lastRow--;
  }
  if (lastRow == -1) {
    return "Empty Column";
  } else {
    return values[lastRow];
  }
}

function lastValueInColumnNumber(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow() - 1; // values[] array index
  var values = SpreadsheetApp.getActiveSheet().getRange(1,column,lastRow + 1).getValues();
  while (lastRow > -1 && values[lastRow] == "") {
      lastRow--;
  }
  if (lastRow == -1) {
    return "Empty Column";
  } else {
    return values[lastRow];
  }
}

function lastRowInColumnNumber(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow() - 1; // values[] array index
  var values = SpreadsheetApp.getActiveSheet().getRange(1,column,lastRow + 1).getValues();
  while (lastRow > -1 && values[lastRow] == "") {
      lastRow--;
  }
  if (lastRow == -1) {
    return "Empty Column";
  } else {
    return lastRow + 1;
  }
}

这些函数正确处理空列,并且还从活动工作表上的最后一行开始倒数 getLastRow(),而不是从工作表上的最后一行(有或没有内容)getMaxRows() 开始倒数,如接受的答案。

【讨论】:

    【解决方案3】:

    如果你的数据之间没有空单元格,你可以使用这个:

    function last_Column_Row(){ 
      var ss = SpreadsheetApp.getActive(); 
      var sheet = ss.getActiveSheet();
      var Direction = SpreadsheetApp.Direction;
      var xcol = 2;//e.g. for column 2 ("B"), to obtain its last row
      var yrow = 8;//e.g. for row 8, to obtain its last column
    
      var lastRow =sheet.getRange(1,xcol).getNextDataCell(Direction.DOWN).getRow();//last row of column 'xcol'
      var lastCol =sheet.getRange(yrow,1).getNextDataCell(Direction.NEXT).getColumn();//last column of row 'yrow'
    };
    

    它获取特定行或列的下一个空单元格1的数量(类似于工作表中的Ctrl +'箭头')

    但是如果你的数据之间有空单元格,你可以使用这个:

    function last_Row_Column2()
    { 
      var ss = SpreadsheetApp.getActive(); 
      var sheet = ss.getActiveSheet();
      var Direction = SpreadsheetApp.Direction;
      var maxR =sheet.getMaxRows();
      var maxC = sheet.getMaxColumns();
    
      var yrow = 8;//e.g. for row 8, to obtain its last column
      var xcol = 2;//e.g. for column 2 ('B'), to obtain its last row
    
      var valMaxR = sheet.getRange(maxR,xcol).getValue();//for the case that the last row has the last value
      var valMaxC = sheet.getRange(yrow,maxC).getValue();//for the case that the last column has the last value
    
      if(valMaxR !=''){var lastRow = maxR;}//if the last row in studied column is the last row of sheet
      else{var lastRow =sheet.getRange(maxR,xcol).getNextDataCell(Direction.UP).getRow();}
    
      if(valMaxC !=''){var lastCol = maxC;}//if the last column in studied row is the last column of sheet(e.g.'Z')
      else{var lastCol =sheet.getRange(yrow,maxC).getNextDataCell(Direction.PREVIOUS).getColumn();}
    };
    

    【讨论】:

      【解决方案4】:

      [UPADTE} 请忽略此答案。而是用户 Serge 的代码。我脑子里放了个屁。他的回答是在各个方面都好得多。这将教会我在您从鸡尾酒之夜回来后不要回答 SO 问题...[/UPDATE]

      以下函数将记录 C 列的最后一个非空白行号。注意:例如,如果 C 列在第 1 行和第 200 行中有值,而第 2-199 行为空白,则该函数将返回 200作为最后一个非空白行 - 它不考虑最后一个非空白行上方的空白行。

      function getLastNonBlankColCrow() {
        var sheet = SpreadsheetApp.getActiveSheet();
        var lastNonBlankColCrow = 0;
        for (var i=1, lenRows=sheet.getRange("C:C").getNumRows(); i<=lenRows; i++) {
          if ( !sheet.getRange(i, 3).isBlank() ) { // 3 is 1-based index of column C
            lastNonBlankColCrow = i;
          }
        }
        Logger.log(lastNonBlankColCrow);
      }
      

      【讨论】:

      • 如果工作表有很多行,这将非常慢...阅读best practices
      • @Sergeinsas 我非常了解最佳实践。如果工作表中有大量行,它可能会变慢(呃),但这是获取特定列的最后一行的唯一方法,而工作表中的其他列可能有更多或更少的填充行。您发布的答案中的代码将返回工作表中最后一行的编号,忽略 C 列的填充行数少于此数。
      • 错误...它将返回指定列的值...请在如此自信之前随意测试。在这种情况下,列作为字母参数(“c”)。
      • 顺便说一句,我实际上正在测试我在这里发布的每一个代码......有时我可能是错的,但肯定不是这样的基本要求......当然我确实测试了这个:-)
      • @Sergeinsas 道歉。你确实是对的。当我不小心发布了我的评论时,我实际上是在设置你的代码来测试。您的代码在 1000 行的工作表中的运行速度也快了大约 5 倍。赞成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2013-05-26
      • 2015-01-09
      • 2021-05-26
      • 2019-05-12
      相关资源
      最近更新 更多