Determinar la última fila en una sola columna

Resuelto 5th4x4 asked hace 11 años • 30 respuestas

Tengo una hoja con datos en cols Ahasta H.

Necesito determinar la última fila de la columna Aque 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)?

5th4x4 avatar Jul 13 '13 23:07 5th4x4
Aceptado

¿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 Avalsmatriz, 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.

Mogsdad avatar Jul 14 '2013 06:07 Mogsdad

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)];
}
Al Johri avatar Dec 03 '2018 04:12 Al Johri

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:

ingrese la descripción de la imagen aquí

la solución aceptada daría 4mientras 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]!='');
Marios avatar Feb 15 '2021 23:02 Marios

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 ;
    }
  }
}
Srik avatar Jul 13 '2013 17:07 Srik