当A列和B列的行数不同时,如何找到C列的最后一行?

5
如何找到列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个小时在这上面。我尝试过类似的问题和他们在这个网站上的解决方案,但我无法让它们工作。我迷失了!: 更有效地查找特定列中最后一行的方法?获取特定列的最后一行函数 - 最佳解决方案


1
可能是选择列的最后一个值的重复问题。 - Serge insas
这是stackoverflow上关于Google apps script最高分帖子的主题:https://dev59.com/Q2855IYBdhLWcg3wvXHd - Serge insas
谢谢Serge。遗憾的是,我不想知道列C中最后一行的值(例如:“4654654”)。但我想知道列C中最后一行是哪一行?行号:1或其他。提前致谢;) - miodf
4个回答

14

如我在上面的评论中提到的,这是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;
}

1
非常棒!对我之前的过早评论感到抱歉。真希望我能给你的答案点赞不止一次! - azawaza
感谢Serge(和azawaza)。它完美地运行了。我不够好,无法像你一样进行更改。所以谢谢。;)根据您的链接https://dev59.com/Q2855IYBdhLWcg3wvXHd,我添加了`function onEdit(event) { SpreadsheetApp.getActiveSheet().getRange("F1").setValue(lastValue("C"));// }`再次感谢。;) - miodf
请发起一个新的问题,清晰地说明您需要做什么。跟进问题不太清楚,也不是非常有用的 S.O 用户 - 谢谢 - Serge insas
亲爱的未来访客,请查看此答案,在我看来更加简洁。 - mTorres
谢谢!这很容易和简单。 - k.b
显示剩余2条评论

1
如果您的数据之间没有空单元格,您可以使用以下方法:
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();}
};

1
这是实现它的函数:

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")

以下是在此背景下另外三个有用的函数:

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

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

0

[更新] 请忽略此答案。请使用用户Serge的代码。我当时有点脑抽了。他的答案在各个方面都更好。这会教训我,不要在鸡尾酒之夜回答SO问题... [/更新]

以下函数将记录列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);
}

如果工作表有很多行,这将非常缓慢...请阅读最佳实践 - Serge insas
@Sergeinsas 我非常了解最佳实践。在工作表中有大量行时,它可能会变得缓慢,但这是获取特定列的最后一行的唯一方法,而工作表中的其他列可能具有更多或更少的填充行。您发布的答案中的代码将返回工作表中最后一行的编号,而不考虑C列是否具有较少的填充行。 - azawaza
1
错误...它将返回指定列的值...在如此肯定之前,请随意测试。在这种情况下,列作为字母参数(“c”)。 - Serge insas
顺便说一下,我实际上会测试我在这里发布的每一段代码...有时我可能会错,但肯定不会在这样基本的要求上出错...当然我已经测试过这个了 :-) - Serge insas
@Sergeinsas 抱歉。您的确是正确的。实际上,我正在设置您的代码进行测试时不小心发布了我的评论。在具有1000行的表格中,您的代码运行速度也快了约5倍。已点赞。 - azawaza
谢谢,没有不好的感觉 :-) - Serge insas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接