我正在寻找一种方法来查找特定列的最后一行(带有数据)。假设 A 列第 100 行的最后一个数据项,B 列第 50 行的最后一个数据项。
.getLastRow(); 将永远返回 100 给我。
我需要一种简单的方法来获得 50(这是 B 列中最后一个非空行的行号)。
我不能使用循环。这非常重要,因为有数千行,它只会花费太多时间。
我用谷歌搜索了很多,但所有的答案都涉及循环。
我正在寻找一种方法来查找特定列的最后一行(带有数据)。假设 A 列第 100 行的最后一个数据项,B 列第 50 行的最后一个数据项。
.getLastRow(); 将永远返回 100 给我。
我需要一种简单的方法来获得 50(这是 B 列中最后一个非空行的行号)。
我不能使用循环。这非常重要,因为有数千行,它只会花费太多时间。
我用谷歌搜索了很多,但所有的答案都涉及循环。
虽然不知道这个方法好不好,但是这个方法呢?此方法不使用循环。请将此作为示例之一进行检查。
getLastRow()
。示例脚本:
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 种模式进行处理。
通过从工作表的顶部搜索来检索特定列的第一个空单元格
通过从工作表的底部搜索来检索特定列的第一个非空单元格
为了实现上述,我认为可以使用以下2种模式。
检索列的值并使用循环搜索结果。
使用 Google Apps Script 的内置方法直接检索结果。
我测量了它们的过程成本。结果,发现以下 2 个脚本是所有方法中最低的。
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);
.在这个问题中,我认为这种模式可能是合适的。
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);
};