Risposte:
Quindi questa soluzione prende una stringa come parametro. Trova quante righe ci sono nel foglio. Ottiene tutti i valori nella colonna specificata. Passa attraverso i valori dalla fine all'inizio finché non trova un valore che non sia una stringa vuota. Alla fine ritorna il valore.
script:
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")
MODIFICARE:
In risposta al commento che richiede l'aggiornamento automatico della funzione:
Il modo migliore che ho potuto trovare è usarlo con il codice sopra:
function onEdit(event) {
SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
Non sarebbe più necessario utilizzare la funzione in una cella come afferma la sezione Utilizzo . Invece stai codificando la cella che desideri aggiornare e la colonna che desideri monitorare. È possibile che ci sia un modo più eloquente per implementarlo (si spera uno che non sia hardcoded), ma questo è il meglio che sono riuscito a trovare per ora.
Nota che se usi la funzione nella cella come indicato in precedenza, si aggiornerà al ricaricamento. Forse c'è un modo per agganciarsi onEdit()
e forzare l'aggiornamento delle funzioni della cella. Non riesco proprio a trovarlo nella documentazione.
Risposta simile alla risposta di caligari , ma possiamo riordinarla semplicemente specificando l'intero intervallo di colonne:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
intervallo ed, simile alla risposta di @ Geta .
COUNT(G2:G)
restituisce 0. Utilizza invece COUNTA(G2:G)
quello che conta solo il numero di valori in un set di dati. COUNTA
è utile solo in combinazione con INDEX
per ottenere l'ultimo valore se non c'è un singolo spazio tra i valori.
COUNTA
. COUNT
conta solo valori numerici: restituirà 0 quando viene fornito, ad esempio celle di testo.
In realtà ho trovato una soluzione più semplice qui:
http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=en
Assomiglia a questo:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
ROW
restituisce il numero di riga, quindi FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
restituisce un array di tutti i numeri di riga non vuoti (non i loro valori), ad esempio [1,2, 3, 7, 12, 14]. Poi MAX
ci dà l'ultimo numero di riga. Viene FILTER
quindi applicato un secondo per filtrare tutte le righe in cui il numero di riga non corrisponde al valore da MAX
(cioè il valore dell'ultima riga non vuota).
La funzione LAST () non è attualmente implementata per selezionare l'ultima cella all'interno di un intervallo. Tuttavia, seguendo il tuo esempio:
=LAST(G2:G9999)
siamo in grado di ottenere l'ultima cella utilizzando la coppia di funzioni INDEX () e COUNT () in questo modo:
=INDEX(G2:G; COUNT(G2:G))
C'è un esempio dal vivo nello spreedsheet in cui ho trovato (e risolto) lo stesso problema (foglio Orzamentos
, cella I5
). Si noti che funziona perfettamente anche facendo riferimento ad altri fogli all'interno del documento.
COUNTA
in quel caso se sei sicuro che non ci sia un singolo spazio tra i valori nella colonna. Vedi i miei commenti alla risposta di dohmoose.
:G
denota l'ultimo elemento? È documentato?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Ho esaminato e provato diverse risposte, ed ecco cosa ho trovato: La soluzione più semplice (vedi la risposta di Dohmoose ) funziona se non ci sono spazi vuoti:
=INDEX(G2:G; COUNT(G2:G))
Se hai spazi vuoti, fallisce.
Puoi gestire uno spazio vuoto semplicemente cambiando da COUNT
a COUNTA
(Vedi la risposta di user3280071 ):
=INDEX(G2:G; COUNTA(G2:G))
Tuttavia, questo fallirà per alcune combinazioni di spazi vuoti. ( 1 blank 1 blank 1
fallisce per me.)
Il codice seguente funziona (vedi la risposta di Nader e il commento di jason ):
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
ma richiede di pensare se si desidera utilizzare COLUMNS
o ROWS
per un determinato intervallo.
Tuttavia, se COLUMNS
viene sostituito con COUNT
mi sembra di ottenere un'implementazione affidabile ea prova di bianco di LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
E poiché COUNTA
ha il filtro integrato, possiamo semplificarne ulteriormente l'utilizzo
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Questo è piuttosto semplice e corretto. E non devi preoccuparti se contare righe o colonne. E a differenza delle soluzioni di script, si aggiorna automaticamente con le modifiche al foglio di calcolo.
E se vuoi ottenere l'ultimo valore di fila, cambia semplicemente l'intervallo di dati:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Per restituire l'ultimo valore da una colonna di valori di testo è necessario utilizzare CONTA.VALORI, quindi è necessaria questa formula:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
combinato con INDEX
non restituirà l'ultimo valore nella colonna.
prova questo:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Supponiamo che la colonna in cui stai cercando l'ultimo valore sia B.
E sì, funziona con gli spazi vuoti.
Sembra che Google Apps Script ora supporti gli intervalli come parametri di funzione. Questa soluzione accetta una gamma:
// 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;
}
Vedi anche la discussione nel forum di assistenza di Google Apps Script: come imposto il ricalcolo delle formule?
Ho guardato le risposte precedenti e sembra che stiano lavorando troppo. Forse il supporto agli script è semplicemente migliorato. Penso che la funzione sia espressa così:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
Nel mio foglio di calcolo utilizzo quindi:
= lastValue(E17:E999)
Nella funzione, ottengo un array di valori con uno per cella di riferimento e questo si limita a scorrere dalla fine dell'array all'indietro finché non trova un valore non vuoto o esaurisce gli elementi. I riferimenti al foglio devono essere interpretati prima che i dati vengano passati alla funzione. Non abbastanza elegante per gestire le multi-dimensioni. La domanda ha chiesto l'ultima cella in una singola colonna, quindi sembra adattarsi. Probabilmente morirà anche se finisci i dati.
Il tuo chilometraggio può variare, ma per me funziona.
Ottiene l'ultimo valore e gestisce i valori vuoti:
=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 risposta
$ =INDEX(G2:G; COUNT(G2:G))
non funziona correttamente in LibreOffice. Tuttavia, con una piccola modifica, funziona perfettamente.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Funziona sempre solo se l'intervallo reale è inferiore a (G2:G10000)
È accettabile rispondere alla domanda originale con una risposta rigorosamente fuori tema :) Puoi scrivere una formula nel foglio di calcolo per farlo. Brutto forse? ma efficace nel normale funzionamento di un foglio di calcolo.
=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
Questo è offerto come un pensiero per una serie di domande nell'area dello script che potrebbero essere fornite in modo affidabile con formule di matrice che hanno il vantaggio di lavorare spesso in modo simile in Excel e OpenOffice.
Stavo giocando con il codice fornito da @tinfini e pensavo che le persone potessero trarre vantaggio da quella che penso sia una soluzione leggermente più elegante (nota che non credo che gli script funzionassero allo stesso modo quando ha creato la risposta originale) ...
//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]);
}
In uso sarebbe simile a questo:
=LastInRange(D2:D)
Ho trovato un altro modo per aiutarti
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-Ritorna l'ultima riga
Maggiori informazioni da anab qui: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Sono sorpreso che nessuno abbia mai dato questa risposta prima. Ma questo dovrebbe essere il più breve e funziona anche in Excel:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
crea un array di 1 / true (1) e 1 / false (0). Poiché LOOKUP
fa un approccio dall'alto verso il basso per trovare 2
e Poiché non troverà mai 2, arriva fino all'ultima riga non vuota e fornisce la posizione di quella.
L'altro modo per farlo, come altri potrebbero aver detto, è:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Trovare l' MAX
imum ROW
della riga non vuota e dargli da mangiareINDEX
In un array di interruzioni senza spazi vuoti, un'altra opzione è Usare la INDIRECT
RC
notazione con COUNTBLANK
. Se V4: V6 è occupato da voci, allora,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
darà la posizione di V6.
Tools -> Scripts -> Script editor...