Seleccionar el último valor de una columna

Respuestas:

54

Entonces, esta solución toma una cadena como parámetro. Encuentra cuántas filas hay en la hoja. Obtiene todos los valores de la columna especificada. Recorre los valores desde el final hasta el principio hasta que encuentra un valor que no es una cadena vacía. Finalmente devuelve el valor.

Guión:

function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();

  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return values[lastRow - 1];
}

Uso:

=lastValue("G")

EDITAR:

En respuesta al comentario que solicita que la función se actualice automáticamente:

La mejor manera que pude encontrar es usar esto con el código anterior:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

Ya no sería necesario utilizar la función en una celda como los estados de la sección Uso . En su lugar, está codificando de forma rígida la celda que le gustaría actualizar y la columna que le gustaría rastrear. Es posible que haya una forma más elocuente de implementar esto (con suerte, una que no esté codificada), pero esta es la mejor que pude encontrar por ahora.

Tenga en cuenta que si usa la función en la celda como se indicó anteriormente, se actualizará al recargar. Tal vez haya una manera de conectarse onEdit()y forzar la actualización de las funciones de la celda. Simplemente no puedo encontrarlo en la documentación.

tinifni
fuente
5
Este es un script de hoja de cálculo de Google. Puede crear un nuevo script enTools -> Scripts -> Script editor...
tinifni
1
: ¡Oh, eso es asombroso! No sabía que Google había implementado scripts. Muchas gracias, funcionó a la perfección
cambraca
1
¿Alguna idea de cómo hacer que se actualice automáticamente cuando cambio los datos en la hoja?
cambraca
Edité mi respuesta con información que debería ayudar. ¡Feliz codificación!
tinifni
5
Hice una edición en este script para que pueda pasar hojas con nombre como lastValue ("Sheet1! A") gist.github.com/2701061
johnwards
165

Respuesta similar a la respuesta de caligari , pero podemos arreglarla simplemente especificando el rango de columna completo:

=INDEX(G2:G, COUNT(G2:G))
dohmoose
fuente
12
Esto parece funcionar siempre que no haya espacios en blanco en el conjunto de datos
Keith Sirmons
Otro buen recurso es la respuesta seleccionada en productforums.google.com/forum/#!topic/docs/p3t3feg7Jic, que muestra cómo obtener la primera, última o enésima fila en un FILTER()rango ed, similar a la respuesta de @ Geta .
Aaron Blenkush
Esta respuesta stackoverflow.com/a/8161172/418111 tiene una fórmula que admite celdas en blanco.
Daniel
8
Como mencionó @KeithSirmons. Si hay espacios en blanco en su columna, no funciona, porque COUNT(G2:G)devuelve 0. En su lugar, use COUNTA(G2:G)que cuente solo el número de valores en un conjunto de datos. COUNTAsolo es útil combinado con INDEXpara obtener el último valor si no hay un solo espacio en blanco entre sus valores.
Christiaan Westerbeek
3
También tenga en cuenta que si sus valores no son numéricos, necesitará COUNTA. COUNTsolo cuenta valores numéricos: devolverá 0 cuando se le proporcione, por ejemplo, celdas de texto.
aire
53

En realidad, encontré una solución más simple aquí:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=es

Se parece a esto:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
Getas
fuente
2
Vaya, esto está increíblemente limpio. ¿Puede explicar exactamente cómo funciona?
cambraca
En realidad no: está bien cuando el rango de fuente ya está ordenado.
Caligari
5
Explicado: ROWdevuelve el número de fila, por lo que FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )devuelve una matriz de todos los números de fila que no están en blanco (no sus valores), por ejemplo [1, 2, 3, 7, 12, 14]. Luego MAXnos da el último número de fila. FILTERLuego se aplica un segundo para filtrar todas las filas en las que el número de fila no coincide con el valor MAX(es decir, el valor de la última fila que no está en blanco).
jhabbott
Ambas instancias de ROW se pueden reemplazar por COLUMN para devolver el último valor en una fila en particular (en lugar del último valor en una columna en particular).
Jon Schneider
2
¿Qué pasa si solo quisiera el número de fila del último valor de la columna?
Nick5a1
44

La función LAST () no está implementada en este momento para seleccionar la última celda dentro de un rango. Sin embargo, siguiendo tu ejemplo:

=LAST(G2:G9999)

podemos obtener la última celda usando el par de funciones INDEX () y COUNT () de esta manera:

=INDEX(G2:G; COUNT(G2:G))

Hay un ejemplo en vivo en la hoja de cálculo donde encontré (y resolví) el mismo problema (hoja Orzamentos, celda I5). Tenga en cuenta que funciona perfectamente incluso haciendo referencia a otras hojas dentro del documento.

caligari
fuente
1
Esto funciona muy bien y se actualiza automáticamente a medida que cambia la hoja. ¡Gracias!
TinaMarie
8
Me gusta la concisión de esta sugerencia, pero no parece funcionar cuando el rango objetivo incluye algunas celdas en blanco (como se menciona en la pregunta original anterior), ya que COUNT () no cuenta las celdas en blanco.
Jon Schneider
@JonSchneider puede usar COUNTAen ese caso si está seguro de que no hay un solo espacio en blanco entre los valores de la columna. Vea mis comentarios a la respuesta de dohmoose.
Christiaan Westerbeek
¿Por qué :Gdenota el último elemento? ¿Está esto documentado?
flow2k
33

Resumen:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

Detalles:

Revisé y probé varias respuestas, y esto es lo que encontré: La solución más simple (ver la respuesta de Dohmoose ) funciona si no hay espacios en blanco:

=INDEX(G2:G; COUNT(G2:G))

Si tiene espacios en blanco, falla.

Puede manejar un espacio en blanco simplemente cambiando de COUNTa COUNTA (consulte la respuesta de user3280071 ):

=INDEX(G2:G; COUNTA(G2:G))

Sin embargo, esto fallará para algunas combinaciones de espacios en blanco. ( 1 blank 1 blank 1me falla)

El siguiente código funciona (vea la respuesta de Nader y el comentario de jason ):

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )

pero requiere pensar si desea usar COLUMNSoROWS para un rango determinado.

Sin embargo, si COLUMNSse reemplaza con COUNTI parece que obtengo una implementación confiable y a prueba de espacios en blanco de LAST:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) ) 

Y dado que COUNTAtiene el filtro integrado, podemos simplificar aún más el uso

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

Esto es algo simple y correcto. Y no tiene que preocuparse por contar filas o columnas. Y, a diferencia de las soluciones de secuencias de comandos, se actualiza automáticamente con cambios en la hoja de cálculo.

Y si desea obtener el último valor de una fila, simplemente cambie el rango de datos:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Doug Bradshaw
fuente
Muy útil para recorrer los pasos y la funcionalidad + limitaciones de cada iteración. Necesitaba obtener el último valor en cada fila, algunos con varios espacios en blanco. Funcionó como por arte de magia. ¡Gracias!
Christiaan Adams
9

Para devolver el último valor de una columna de valores de texto, debe usar COUNTA, por lo que necesitaría esta fórmula:

=INDEX(G2:G; COUNTA(G2:G))
user3280071
fuente
1
Pero solo si no hay un solo espacio en blanco entre sus valores. Si lo hay, COUNTAcombinado con INDEXno devolverá el último valor de la columna.
Christiaan Westerbeek
7

prueba esto: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Suponga que la columna en la que busca el último valor es B.

Y sí, funciona con espacios en blanco.

Andrew Anderson
fuente
6

Parece que Google Apps Script ahora admite rangos como parámetros de función. Esta solución acepta un rango:

// Returns row number with the last non-blank value in a column, or the first row
//   number if all are blank.
// Example: =rowWithLastValue(a2:a, 2)
// Arguments
//   range: Spreadsheet range.
//   firstRow: Row number of first row. It would be nice to pull this out of
//     the range parameter, but the information is not available.
function rowWithLastValue(range, firstRow) {
  // range is passed as an array of values from the indicated spreadsheet cells.
  for (var i = range.length - 1;  i >= 0;  -- i) {
    if (range[i] != "")  return i + firstRow;
  }
  return firstRow;
}

Consulte también el debate en el foro de ayuda de Google Apps Script: ¿Cómo fuerzo el recalculado de fórmulas?

craig3353
fuente
6

Miré las respuestas anteriores y parece que están trabajando demasiado. Quizás el soporte de secuencias de comandos simplemente ha mejorado. Creo que la función se expresa así:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

En mi hoja de cálculo utilizo:

= lastValue(E17:E999)

En la función, obtengo una matriz de valores con uno por celda referenciada y esto solo itera desde el final de la matriz hacia atrás hasta que encuentra un valor no vacío o se queda sin elementos. Las referencias a hojas deben interpretarse antes de que los datos se pasen a la función. Tampoco es lo suficientemente elegante como para manejar múltiples dimensiones. La pregunta solicitó la última celda en una sola columna, por lo que parece encajar. Probablemente desaparecerá si te quedas sin datos también.

Su kilometraje puede variar, pero esto funciona para mí.

Ted H.
fuente
5
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

sin codificación rígida.

desnyki
fuente
5

Esta funciona para mí:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Pedro
fuente
Una buena solución, que también funciona en presencia de celdas vacías.
jochen
5

Esto obtiene el último valor y maneja valores vacíos:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
Nader
fuente
también funciona para columnas. Solo sustituí algunas cosas. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
Jason
solución genérica:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
Jason
Para mí, esta es la respuesta "correcta". Razonablemente compacto y fácil de entender, y funciona con espacios en blanco.
aardvarkk
4

En una columna con espacios en blanco, puede obtener el último valor con

=+sort(G:G,row(G:G)*(G:G<>""),)
JPV
fuente
Buena solucion Sin embargo, sospecho que la variante de @ Pedro (usando INDEX y MAX) puede ser un poco más eficiente que usar SORT.
Jochen
4

La respuesta

$ =INDEX(G2:G; COUNT(G2:G))

no funciona correctamente en LibreOffice. Sin embargo, con un pequeño cambio, funciona perfectamente.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

Siempre funciona solo si el rango real es menor que (G2:G10000)

Manuel Ferreira
fuente
Esta publicación fue etiquetada como "Google Spreadsheet" y "Google Apps Script", nada relacionado con Libre Office ... estás fuera de tema
Serge insas
Un tema no muy lejano ya que el título de la pregunta, Seleccionar el último valor de una columna , podría ser encontrado fácilmente por algún pobrecito usando LibreOffice o Numbers. Soy un aficionado a las hojas de cálculo que sabe lo suficiente para ser peligroso. Lo que puedo deducir es que Google lo ha hecho de modo que si su segundo argumento para un rango es solo una columna, seleccionará el resto de la columna para que la gente no tenga que usar el truco de números muy grandes que descubrió.
Aaron
3

¿Es aceptable responder a la pregunta original con una respuesta estrictamente fuera de tema? Puede escribir una fórmula en la hoja de cálculo para hacer esto. ¿Feo quizás? pero eficaz en el funcionamiento normal de una hoja de cálculo.

=indirect("R"&ArrayFormula(max((G:G<>"")*row(G:G)))&"C"&7)


(G:G<>"") gives an array of true false values representing non-empty/empty cells
(G:G<>"")*row(G:G) gives an array of row numbers with zeros where cell is empty
max((G:G<>"")*row(G:G)) is the last non-empty cell in G

Esto se ofrece como una idea para una variedad de preguntas en el área de scripts que podrían entregarse de manera confiable con fórmulas de matriz que tienen la ventaja de funcionar a menudo de manera similar en Excel y Openoffice.

DavidF
fuente
3
function getDashboardSheet(spreadsheet) {
  var sheetName = 'Name';
  return spreadsheet.getSheetByName(sheetName);
}
      var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);  
      var dashboardSheet = getDashboardSheet(spreadsheet);
      Logger.log('see:'+dashboardSheet.getLastRow());
Mariana
fuente
3

Estaba jugando con el código proporcionado por @tinfini, y pensé que la gente podría beneficiarse de lo que creo que es una solución un poco más elegante (tenga en cuenta que no creo que los scripts funcionen de la misma manera cuando creó la respuesta original) ...

//Note that this function assumes a single column of values, it will 
//not  function properly if given a multi-dimensional array (if the 
//cells that are captured are not in a single row).

function LastInRange(values) 
{
  for (index = values.length - 1; values[index] == "" && index > 0; index--) {}
  return String(values[index]);
}

En uso, se vería así:

=LastInRange(D2:D)
Jonathan Cavell
fuente
2

Con respecto al comentario de @ Jon_Schneider, si la columna tiene celdas en blanco, simplemente use COUNTA ()

=INDEX(G2:G; COUNT**A**(G2:G))
pedro
fuente
4
No, eso tampoco funciona. La diferencia entre COUNT y COUNTA está en la distinción entre números y texto, que es irrelevante aquí.
mhsmith
2

Encontré una ligera variación que funcionó para eliminar los espacios en blanco de la parte inferior de la mesa. = índice (G2: G, COUNTIF (G2: G, "<>"))

Chris
fuente
1

Me sorprende que nadie haya dado esta respuesta antes. Pero este debería ser el más corto e incluso funciona en Excel:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>""crea una matriz de 1 / verdadero (1) y 1 / falso (0). Dado que LOOKUPhace un enfoque de arriba hacia abajo para encontrar2 y Dado que nunca encontrará 2, llega a la última fila que no está en blanco y da la posición de eso.

La otra forma de hacer esto, como otros podrían haber mencionado, es:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Encontrar el MAXimum ROWde la fila no en blanco y alimentarlo aINDEX

En una matriz de interrupción en blanco cero, usar la INDIRECT RCnotación con COUNTBLANK es otra opción. Si V4: V6 está ocupado con entradas, entonces,

V18 :

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

dará la posición de V6.

El maestro
fuente
1

para obtener el último valor de una columna, también puede usar la MAXfunción con la IFfunción

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
jugador0
fuente