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

IT技术 javascript google-apps-script google-sheets
2021-02-22 20:22:05

我正在寻找一种方法来查找特定列的最后一行(带有数据)。假设 A 列第 100 行的最后一个数据项,B 列第 50 行的最后一个数据项。

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

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

我不能使用循环。这非常重要,因为有数千行,它只会花费太多时间。

我用谷歌搜索了很多,但所有的答案都涉及循环。

6个回答

虽然不知道这个方法好不好,但是这个方法呢?此方法不使用循环。请将此作为示例之一进行检查。

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

示例脚本:

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;

2021 年 5 月 19 日更新:

在这种情况下,我想使用以下 2 种模式进行处理。

  1. 通过从工作表的顶部搜索来检索特定列的第一个空单元格

  2. 通过从工作表的底部搜索来检索特定列的第一个非空单元格

为了实现上述,我认为可以使用以下2种模式。

  1. 检索列的值并使用循环搜索结果。

  2. 使用 Google Apps Script 的内置方法直接检索结果。

我测量了它们的过程成本。结果,发现以下 2 个脚本是所有方法中最低的。

1.通过从工作表的顶部搜索来检索特定列的第一个空单元格

Object.prototype.get1stEmptyRowFromTop = function (columnNumber, offsetRow = 1) {
  const range = this.getRange(offsetRow, columnNumber, 2);
  const values = range.getDisplayValues();
  if (values[0][0] && values[1][0]) {
    return range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1;
  } else if (values[0][0] && !values[1][0]) {
    return offsetRow + 1;
  }
  return offsetRow;
};

// Please run this function.
function main() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  const res = sheet.get1stEmptyRowFromTop(3);
  console.log(res); // Retrieve the 1st empty row of column "C" by searching from TOP of sheet.
}
  • 请给出工作表对象和列号。
  • 在此脚本中,当使用第二个参数时,您可以设置偏移行。例如,当第一行和第二行是标题行时,您可以将此脚本用作const res = sheet.get1stEmptyRowFromTop(3, 2);.

2.通过从工作表的底部搜索来检索特定列的第一个非空单元格

在这个问题中,我认为这种模式可能是合适的。

Object.prototype.get1stNonEmptyRowFromBottom = function (columnNumber, offsetRow = 1) {
  const search = this.getRange(offsetRow, columnNumber, this.getMaxRows()).createTextFinder(".").useRegularExpression(true).findPrevious();
  return search ? search.getRow() : offsetRow;
};

// Please run this function.
function main() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  const res = sheet.get1stNonEmptyRowFromBottom(3);
  console.log(res); // Retrieve the 1st non empty row of column "C" by searching from BOTTOM of sheet.
}
  • 请给出工作表对象和列号。
  • 在此脚本中,当使用第二个参数时,您可以设置偏移行。例如,当第一行和第二行是标题行时,您可以将此脚本用作const res = sheet.get1stNonEmptyRowFromBottom(3, 2);.

结果:

当使用上述脚本时,得到以下结果。

在此处输入图片说明

  • “C”列使用“通过从工作表的顶部搜索来检索特定列的第一个空单元格”的脚本时,将获得第 6 行。

  • “C”列使用“通过从工作表的底部搜索来检索特定列的第一个非空单元格”的脚本时,将获得第 9 行。

参考:

您还可以使用以下代码:

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

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

这对我有用:

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

我稍微改变了 Tanaike 的回答。此版本创建工作表而不是电子表格。

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

这似乎有效:

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