确定单列中的最后一行

106

我的表格中有数据分布在从 A 列到 H 列。

我需要确定在列 A 中包含数据的最后一行(数据是连续的 - 没有数据/行之间的空隙)。

其他列中也有数据,这些数据比列 A 的行数要多,所以我需要仅隔离列 A 中的数据。(和/或只是列 A 中的某个范围)。

我可以在电子表格级别上使用

=COUNTA(A2:A100)
然而,在我为Google应用脚本解决方案进行的所有研究中,我似乎只能找到执行多个函数并涵盖数十行代码的要求 - 包括大量的“i ++”内容...我可以通过直接从“A1”进行偏移来更简单地完成此操作。
可能有一种特定于列的修改此方法的方式吗?
var aLast = ss.getDataRange().getNumRows();

如果需要复杂的过程,那就用复杂的过程。但我很难想象(更难找到!)一个更简单的解决方案。

有没有人愿意启发我一下(或者打破我的幻想)?

30个回答

0

Mogsdad的解决方案的更新:

    var Avals = ss.getRange("A1:A").getValues();
    var Alast = Avals.filter(function(r){return r[0].length>0});

0

我意识到这是一个相当古老的帖子,但当搜索此问题时,它是最早的结果之一。

有一个简单的解决方案,据我所知,它一直都可用... 这也是在VBA中完成相同任务的"推荐"方式。

var lastCell = mySheet.getRange(mySheet.getLastRow(),1).getNextDataCell(
  SpreadsheetApp.Direction.UP
);

这将返回您在getRange(row,column)中指定的列中的最后一个完整单元格,如果您想使用第一个空行,请记得将其加1。


这会返回一个范围吗?你不想让它像 getLastRow() 一样返回一个数字吗? - DanCue

0

这是适合我的方法:

var ss = SpreadsheetApp.openById(YourSpreadsheetID);
var main_sheet = ss.getSheetByName(YourMainSheet);
main_sheet.getRange('K16').activate(); // substitute your cell from where you want to count
main_sheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
var last_row_submissions = main_sheet.getCurrentCell().getRowIndex();

0

这是我最好的方法,获取参考列,然后获取最后一行

var ssm = SpreadsheetApp.openById(id).getSheetByName(name);
var lastRow = ssm.getRange('A2').getNextDataCell(SpreadsheetApp.Direction.DOWN).offset(1, 0).getRow();
ssm.getRange(lr, 1, 1, 8).setValues([data]);

0

个人而言,我曾经遇到类似的问题并采用了以下解决方案:

function getLastRowinColumn (ws, column) {
  var page_lastrow = ws.getDataRange().getNumRows();
  var last_row_col = 0
  for (i=1; i<=page_lastrow;i++) {
    if (!(spread.getRange(column.concat("",i)).isBlank())) {last_row_col = i};
  }
  return last_row_col
}

它查找ws中的行数,并循环遍历您列中的每个单元格。当它找到一个非空单元格时,它会更新该单元格在last_row_col变量中的位置。它的优点是允许您拥有非连续的列并仍然知道最后一行(假设您正在遍历整个列)。


0
我的方法接受一个扁平数组的列值,将其反转,然后搜索第一个定义单元格的索引。
从值数组的总长度中减去该索引,得到非反转的索引,然后添加可能在列值之前的任何行,以返回电子表格中该列的实际最后一行。
const colValues = WORKSHEET.getRange(STARTROW, STARTCOLUMN, WORKSHEET.getLastRow(), 1)
    .getValues()
    .flat();

const getLastRowOfCol = (colValues, startRow = 1) => {
  return (colValues.length - colValues.reverse().findIndex(cell => !!cell)) + startRow - 1;
};

根据我的使用情况,我需要在第13行之后获取第5列的最后一行。

const ss = SpreadsheetApp.openById(mySpreadsheetId);
const ws = ss.getSheetByName('myWorkSheetName');

const colValues = ws.getRange(14, 5, ws.getLastRow(), 1)
    .getValues()
    .flat()
const colLastRow = getLastRowOfCol(colValues, 13)

0
我正在使用一行代码来获取具有数据的最后一行B列(索引2)如下:
var tmp3 = pointDataSheet.getRange(pointDataSheet.getLastRow() + 1,2).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();

-1
我正在使用getDataRange()函数,然后接着使用getNumRows()函数。第一个函数会返回包含数据的维度范围,而第二个函数则会返回该范围内的行数。
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var lastRow = ws.getDataRange().getNumRows();

顺便说一下,我希望它对所有情况都有效。


1
这不是对 OP 的答案,因为 OP 指出其他列中可能存在更多的数据行。getDataRange 返回一个矩形数组。 - tehhowch

-1
这里有一种解决方法。它使用一个 while 循环,但考虑了行之间的空隙。
function getLastRow (column) {
  var iLastRow = ss.getActiveSheet().getMaxRows();
  var aValues = ss.getActiveSheet().getRange(column + ":" + column).getValues();
  var row = "";
  while(row == ""){
    row = aValues[iLastRow-1];
    iLastRow--;
  }
  return iLastRow;
}

为什么要从最大行开始?只需从具有数据的最后一行开始(在任何列中),然后检查所需的列即可。 - tehhowch

-1

我重写了getLastRow/getLastColumn函数,以指定行索引或列索引。

function get_used_rows(sheet, column_index){
      for (var r = sheet.getLastRow(); r--; r > 0) {
        if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(r, column_index).getValue() != ""){
          return r;
          break;
        }
      }
    }

function get_used_cols(sheet, row_index){
  for (var c = sheet.getLastColumn(); c--; c > 0) {
    if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(row_index, c).getValue() != ""){
      return c;
      break;
    }
  }
}

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