Respuestas:
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.
Respuesta similar a la respuesta de caligari , pero podemos arreglarla simplemente especificando el rango de columna completo:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
rango ed, similar a la respuesta de @ Geta .
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. COUNTA
solo es útil combinado con INDEX
para obtener el último valor si no hay un solo espacio en blanco entre sus valores.
COUNTA
. COUNT
solo cuenta valores numéricos: devolverá 0 cuando se le proporcione, por ejemplo, celdas de texto.
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)))))
ROW
devuelve 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 MAX
nos da el último número de fila. FILTER
Luego 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).
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.
COUNTA
en 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.
:G
denota el último elemento? ¿Está esto documentado?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
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 COUNT
a 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 1
me 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 COLUMNS
oROWS
para un rango determinado.
Sin embargo, si COLUMNS
se reemplaza con COUNT
I 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 COUNTA
tiene 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) )
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))
COUNTA
combinado con INDEX
no devolverá el último valor de la columna.
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.
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?
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í.
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)) ) ) )
=INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
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)
¿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.
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)
Encontré otra forma, puede ser que te ayude
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-volverá la última fila
Más información de anab aquí: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
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 LOOKUP
hace 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 MAX
imum ROW
de la fila no en blanco y alimentarlo aINDEX
En una matriz de interrupción en blanco cero, usar la INDIRECT
RC
notació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.
Tools -> Scripts -> Script editor...