Google Script - 获取特定列的最后一行

时间:2017-06-15 08:33:04

标签: javascript google-apps-script google-sheets

我正在寻找一种方法来查找特定列的最后一行(包含数据)。让我们说第100行的第A列最后一个数据项和第B行的最后一个数据项。

.getLastRow();将永远返回100给我。

我需要一种简单的方法来获得50(这是B列中最后一个非空行的行号)。

我无法使用循环。它非常重要,因为有数千行,只需要花费太多时间。

我搜索了很多内容,但所有答案都涉及循环播放。

7 个答案:

答案 0 :(得分:2)

您还可以使用以下代码:

function findTheLastRow(){
  var ui = SpreadsheetApp.getUi();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  var range = sheet.getRange("B1:B").getValues();
  var filtered_r = range.filter(String).length;

  ui.alert("Column B's last cell is number: " + filtered_r + " and its value is: " + range[filtered_r - 1][0]);
}

此脚本计算列中具有值的单元格数量,因此最后一个单元格上方的单元格需要具有值才能获得正确的结果。

答案 1 :(得分:1)

虽然我不知道这是不是一个好方法,但这种方法怎么样?此方法不使用循环。请将其作为样本之一进行检查。

  1. 检索您想知道最后一行数的列数据。
  2. 将列数据作为临时表格导入新电子表格。 (在这种情况下,您还可以将新工作表添加到当前使用的电子表格中,并且可以将其用作临时工作表。)
  3. 使用getLastRow()检索最后一行的数量。
  4. 删除临时电子表格。
  5. 示例脚本:

    var col = ##; // Here, please input a column number.
    var ss = SpreadsheetApp.getActiveSheet();
    var coldata = ss.getRange(1, col, ss.getLastRow(), 1).getValues();
    var tempss = SpreadsheetApp.create("temporary_sheet");
    tempss.getActiveSheet().getRange(1,1,coldata.length, coldata[0].length).setValues(coldata);
    var last_row = tempss.getLastRow(); // The number of last row
    Drive.Files.remove(tempss.getId()); // In this case, the file is removed using Drive API.
    

    注意:

    在上述情况下,即使列具有空单元格,也可以检索最后一行的数量。如果列没有空单元格,则可以通过以下脚本检索特定列的最后一行数。这不会创建临时表。

    var last_row = ss.getRange(1, col, ss.getLastRow(), 1).getValues().filter(String).length;
    

答案 2 :(得分:1)

这对我有用:

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();

答案 3 :(得分:0)

我改变了田边池的答案。此版本创建工作表而不是电子表格。

var col = 1; // Here, please input a column number, in this case it is the number of A column(1).
var ss = SpreadsheetApp.getActiveSheet();
var coldata = ss.getRange(1, col, ss.getLastRow(), 1).getValues();
var tempss = SpreadsheetApp.getActiveSpreadsheet().insertSheet("temporary_sheet");
tempss.getRange(1,1,coldata.length, coldata[0].length).setValues(coldata);
var last_row = tempss.getLastRow(); // The number of last row
SpreadsheetApp.getActiveSpreadsheet().deleteSheet(SpreadsheetApp.getActiveSpreadsheet().getSheetByName("temporary_sheet"));

答案 4 :(得分:0)

这似乎可行:

function myFunction() {
    var spreadsheet = SpreadsheetApp.getActive();
    spreadsheet.getRange('B1').activate();
    spreadsheet.getCurrentCell().getNextDataCell(SpreadsheetApp.Direction.DOWN).activate();
    var LastDataRow = spreadsheet.getCurrentCell().getRowIndex();
    Logger.log(LastDataRow);
};

答案 5 :(得分: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]);

答案 6 :(得分: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)
相关问题