Determinar la última fila en una sola columna
Tengo una hoja con datos en cols A
hasta H
.
Necesito determinar la última fila de la columna A
que contiene datos (todo es contiguo, sin espacios en los datos/filas).
También hay datos en las otras columnas que tienen más filas de datos que columnas A
, por lo que necesito aislar solo la columna A
. (Y/o simplemente un rango dentro de col A
).
Puedo hacer esto en el nivel de la hoja de cálculo usando
=COUNTA(A2:A100)
Sin embargo, en toda mi investigación para una solución de Google Apps Script, todo lo que parece encontrar son requisitos para realizar múltiples funciones que abarcan docenas de líneas de código, incluidas muchas i++
cosas... Lo cual podría hacer de manera menos compleja compensando directamente desde A1
.
¿Existe posiblemente una forma específica de columna de modificar este método?
var aLast = ss.getDataRange().getNumRows();
Si lo que se requiere es un proceso complicado, que así sea. Pero me resulta difícil imaginar (¡y aún más difícil encontrar!) una solución más sencilla.
¿Alguien quiere iluminarme (o hacer estallar mi burbuja)?
¿Qué tal usar un truco de JavaScript?
var Avals = ss.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
Tomé prestada esta idea de esta respuesta . El Array.filter()
método opera en la Avals
matriz, que contiene todas las celdas de la columna A. Al filtrar por el constructor de una función nativa, obtenemos solo elementos no nulos.
Esto funciona sólo para una sola columna; Si el rango contiene varias columnas, el resultado filter()
incluirá celdas de todas las columnas y, por lo tanto, estará fuera de las dimensiones pobladas del rango.
Esto obtendrá la última fila de una hoja suponiendo que se base en la columna A.
function getLastDataRow(sheet) {
var lastRow = sheet.getLastRow();
var range = sheet.getRange("A" + lastRow);
if (range.getValue() !== "") {
return lastRow;
} else {
return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
}
}
Esto corrige la respuesta parcialmente correcta de @ mrityunjay-pandey.
Para ampliar esta respuesta para obtener la última fila y columna, podemos usar:
function columnToLetter(column) {
var temp, letter = '';
while (column > 0) {
temp = (column - 1) % 26;
letter = String.fromCharCode(temp + 65) + letter;
column = (column - temp - 1) / 26;
}
return letter;
}
function letterToColumn(letter) {
var column = 0, length = letter.length;
for (var i = 0; i < length; i++) {
column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);
}
return column;
}
function getLastDataColumn(sheet) {
var lastCol = sheet.getLastColumn();
var range = sheet.getRange(columnToLetter(lastCol) + "1");
if (range.getValue() !== "") {
return lastCol;
} else {
return range.getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn();
}
}
function getLastDataRow(sheet) {
var lastRow = sheet.getLastRow();
var range = sheet.getRange("A" + lastRow);
if (range.getValue() !== "") {
return lastRow;
} else {
return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
}
}
function run() {
var sheet = SpreadsheetApp.getActiveSheet();
var [startRow, lastRow] = [2, getLastDataRow(sheet)];
var [startCol, lastCol] = [1, getLastDataColumn(sheet)];
}
Actualización 2021: también considera celdas vacías
La respuesta aceptada, así como la mayoría de las respuestas (si no todas), tienen una limitación común que podría no ser el caso del propietario de la pregunta (tienen datos contiguos) pero sí de los futuros lectores.
- Es decir, si la columna seleccionada contiene celdas vacías en el medio, la respuesta aceptada daría un resultado incorrecto.
Por ejemplo, considere este escenario muy simple:
la solución aceptada daría 4
mientras que la respuesta correcta es 6
.
Solución:
Encuentre el índice del primer valor no vacío comenzando desde el final de la matriz utilizando el método inverso .
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1')
const lrow = sh.getLastRow();
const Avals = sh.getRange("A1:A"+lrow).getValues();
const Alast = lrow - Avals.reverse().findIndex(c=>c[0]!='');
Aunque no se me ocurre ninguna fórmula sencilla, no se necesitan docenas de líneas de código para encontrar la última fila de la columna A. Pruebe esta sencilla función. Úselo en una celda de la forma normal en que usaría alguna otra función.=CountColA()
function CountColA(){
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
for(var i = data.length-1 ; i >=0 ; i--){
if (data[i][0] != null && data[i][0] != ''){
return i+1 ;
}
}
}