I'm new to JS and use of Google App Script, so pardon my lack of JS knowledge.
I got a simple .gs script to work. It converts content in one cell to a hyperlink (e.g. if text is "blah", it would be "https://example.com/blah").
The script retrieves the number of rows to operate on. For one sheet, this does it correctly and truncates it to the last entry (row=31) even though the sheet has 1000 rows. However, for another sheet, it does not and returns 999:
Here's the debug for when it wasn't right:
Apr 8, 2022, 11:20:53 AM Debug doiColumn: 10 numRows: 999
Here it is for another sheet that worked as intended:
Apr 8, 2022, 9:44:47 AM Debug doiColumn: 5 numRows: 31
The docs say: "Returns the position of the last row that has content."
For illustration, here is a snippet of the code:
let spreadsheet = SpreadsheetApp.getActive();
let sheet = SpreadsheetApp.getActiveSheet();
const column = getColumn(sheet, column_name);
let range = sheet.getRange(2, column, sheet.getLastRow() - 1, 1)
console.log(range.getValues());
const numRows = range.getNumRows();
console.log(`column: ${column} numRows: ${numRows}`)
I would like to make sure that .getLawRow() is truncated. Otherwise this script runs longer than it should.
Sorry I could not fit it into a comment
It requires col = column number, sh = sheet (not the name) ,ss = Spreadsheet (not the name)
function getColumnHeight(col, sh, ss) {
var ss = ss || SpreadsheetApp.getActive();
var sh = sh || ss.getActiveSheet();
var col = col || sh.getActiveCell().getColumn();
var rcA = [];
if (sh.getLastRow()){ rcA = sh.getRange(1, col, sh.getLastRow(), 1).getValues().flat().reverse(); }
let s = 0;
for (let i = 0; i < rcA.length; i++) {
if (rcA[i].toString().length == 0) {
s++;
} else {
break;
}
}
return rcA.length - s;
//const h = Utilities.formatString('col: %s len: %s', col, rcA.length - s);
//Logger.log(h);
//SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(h).setWidth(150).setHeight(100), 'Col Length')
}
There are other ways to do it but I prefer this one. It's been reliable for me
Using ranges like this sheet.getRange("A1:Z") will also provide you will a bunch of nulls from getLastRow() to getMaxRows() which then need to be filter out but if you do have a null within your data then that will also get removed and now you have bogus data because that row being removed now messes up your row order.
Try to replace .getLastRow() by
.getLastDataRow(column)
and add this prototype function
Object.prototype.getLastDataRow = function(col){
var lastRow = this.getLastRow();
if (col == null){col=1}
var range = this.getRange(lastRow,col);
if (range.getValue() !== "") {
return lastRow;
} else {
return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
}
};