sheets scripts script openbyurl macro google ejemplos docs developers developer apps app google-apps-script google-spreadsheet

google-apps-script - scripts - openbyurl google script



Seleccionar el Ășltimo valor de una columna (20)

Tengo una hoja de cálculo con algunos valores en la columna G. Algunas celdas están vacías en el medio, y necesito obtener el último valor de esa columna en otra celda.

Algo como:

=LAST(G2:G9999)

excepto que LAST no es una función.


Resumen:

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

Detalles:

He revisado y probado varias respuestas, y esto es lo que he encontrado: 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 del usuario3280071 ):

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

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

El siguiente código funciona (ver 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 o ROWS para un rango determinado.

Sin embargo, si COLUMNS se reemplaza con COUNT , parece que obtengo una implementación confiable, a prueba de 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 incorporado, 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 script, se actualiza automáticamente con los cambios en la hoja de cálculo.

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

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )


¿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. ¿Ugly quizás? pero efectivo 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 serie de preguntas en el área de guiones que podrían entregarse de manera confiable con fórmulas de matriz que tienen la ventaja de que a menudo funcionan de manera similar en excel y openoffice.


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

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



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

=+sort(G:G,row(G:G)*(G:G<>""),)


Entonces esta solución toma una cadena como su parámetro. Encuentra cuántas filas hay en la hoja. Obtiene todos los valores en 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, reestablece 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 de arriba:

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

Ya no se necesitaría usar la función en una celda como los estados de la sección Uso . En su lugar, está codificando la celda que desea actualizar y la columna de la que desea realizar un seguimiento. Es posible que haya una forma más elocuente de implementar esto (con suerte uno que no esté codificado), pero esto es lo mejor que pude encontrar por el momento.

Tenga en cuenta que si usa la función en la celda como se indicó anteriormente, se actualizará al volver a cargar. Tal vez haya una forma de engancharse en onEdit() y forzar en las funciones de la célula a actualizarse. Simplemente no puedo encontrarlo en la documentación.


Esta funciona para mí:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))


Estaba jugando con el código dado por @tinfini, y pensé que la gente podría beneficiarse de lo que creo que es una solución ligeramente más elegante (nótese que no creo que los guiones 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)


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)) ) ) )


Estoy sorprendido de que nadie haya dado esta respuesta antes. Pero esto 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 acercamiento de arriba hacia abajo para encontrar 2 y Dado que nunca encontrará 2, llega a la última fila que no está en blanco y le 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 MÁXIMO ROW de la fila que no está en blanco y alimentarlo a INDEX

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

V18 :

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

le dará la posición de V6.



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 he encontrado (y resuelto) el mismo problema (hoja Orzamentos , celda I5 ). Tenga en cuenta que funciona perfectamente, incluso haciendo referencia a otras hojas dentro del documento.


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)


Miré las respuestas anteriores y parece que están trabajando demasiado. Tal vez 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, uso:

= lastValue(E17:E999)

En la función, obtengo una matriz de valores con uno por celda referenciada y esto simplemente 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 de las hojas deben interpretarse antes de que los datos se pasen a la función. No es lo suficientemente elegante como para manejar multidimensiones, tampoco. La pregunta sí pidió la última celda en una sola columna, por lo que parece encajar. Probablemente morirá si te quedas sin datos también.

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


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

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


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 la discusión en el foro de ayuda de Google Apps Script: ¿Cómo fuerzo a las fórmulas a volver a calcular?


Respuesta similar a la respuesta de Caligari , pero podemos arreglarlo simplemente especificando el rango completo de columnas:

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


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

Suponga que la columna en la que está buscando el último valor es B.

Y sí, funciona con espacios en blanco.


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());


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

sin codificación dura.