Antworten:
Diese Lösung verwendet also einen String als Parameter. Es wird ermittelt, wie viele Zeilen sich im Blatt befinden. Es werden alle Werte in der angegebenen Spalte abgerufen. Es durchläuft die Werte vom Ende bis zum Anfang, bis ein Wert gefunden wird, der keine leere Zeichenfolge ist. Schließlich wird der Wert neu eingestellt.
Skript:
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];
}
Verwendung:
=lastValue("G")
BEARBEITEN:
Als Antwort auf den Kommentar, in dem die Funktion automatisch aktualisiert wird:
Der beste Weg, den ich finden konnte, ist, dies mit dem obigen Code zu verwenden:
function onEdit(event) {
SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
Es wäre nicht länger erforderlich, die Funktion in einer Zelle zu verwenden, wie im Abschnitt " Verwendung " angegeben. Stattdessen codieren Sie die Zelle, die Sie aktualisieren möchten, und die Spalte, die Sie verfolgen möchten, hart. Es ist möglich, dass es einen eloquenteren Weg gibt, dies zu implementieren (hoffentlich einen, der nicht fest codiert ist), aber dies ist der beste, den ich jetzt finden konnte.
Beachten Sie, dass die Funktion beim erneuten Laden aktualisiert wird, wenn Sie sie wie oben angegeben in der Zelle verwenden. Vielleicht gibt es eine Möglichkeit, sich in Zellenfunktionen einzuklinken onEdit()
und deren Aktualisierung zu erzwingen. Ich kann es einfach nicht in der Dokumentation finden.
Ähnliche Antwort auf Caligaris Antwort , aber wir können sie aufräumen, indem wir nur den vollständigen Spaltenbereich angeben :
=INDEX(G2:G, COUNT(G2:G))
FILTER()
ed-Bereich abgerufen wird, ähnlich wie bei @ Getas Antwort .
COUNT(G2:G)
Wenn Ihre Spalte Leerzeichen enthält, funktioniert dies nicht, da 0 zurückgegeben wird. Verwenden Sie stattdessen COUNTA(G2:G)
nur die Anzahl der Werte in einem Dataset. COUNTA
ist nur dann nützlich INDEX
, wenn Sie den letzten Wert erhalten, wenn zwischen Ihren Werten kein einziges Leerzeichen steht.
COUNTA
. COUNT
zählt nur numerische Werte: Es wird 0 zurückgegeben, wenn z. B. Textzellen angegeben werden.
Eigentlich habe ich hier eine einfachere Lösung gefunden:
http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=de
Es sieht aus wie das:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
ROW
Gibt die Zeilennummer zurück, FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
gibt also ein Array aller nicht leeren Zeilennummern (nicht deren Werte) zurück, z. B. [1,2, 3, 7, 12, 14]. Dann MAX
gibt uns die letzte Zeilennummer. Eine Sekunde FILTER
wird dann angewendet, um alle Zeilen herauszufiltern, bei denen die Zeilennummer nicht mit dem Wert von übereinstimmt MAX
(dh dem Wert der letzten nicht leeren Zeile).
Die Funktion LAST () ist derzeit nicht implementiert, um die letzte Zelle innerhalb eines Bereichs auszuwählen. Folgen Sie jedoch Ihrem Beispiel:
=LAST(G2:G9999)
Mit den beiden Funktionen INDEX () und COUNT () können wir die letzte Zelle auf folgende Weise erhalten:
=INDEX(G2:G; COUNT(G2:G))
Es gibt ein Live-Beispiel auf dem Spreedsheet, in dem ich das gleiche Problem (Blatt Orzamentos
, Zelle I5
) gefunden (und gelöst ) habe. Beachten Sie, dass es auch unter Bezugnahme auf andere Blätter im Dokument einwandfrei funktioniert.
COUNTA
in diesem Fall verwenden, wenn Sie sicher sind, dass zwischen den Werten in der Spalte kein einziges Leerzeichen steht. Siehe meine Kommentare zu Dohmooses Antwort.
:G
bezeichnet das letzte Element? Ist das dokumentiert?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Ich habe mehrere Antworten durchgesehen und ausprobiert, und Folgendes habe ich gefunden: Die einfachste Lösung (siehe Dohmoose-Antwort ) funktioniert, wenn keine Leerzeichen vorhanden sind:
=INDEX(G2:G; COUNT(G2:G))
Wenn Sie Leerzeichen haben, schlägt dies fehl.
Sie können mit einem Leerzeichen umgehen, indem Sie einfach von COUNT
zu wechseln COUNTA
(siehe Antwort von user3280071 ):
=INDEX(G2:G; COUNTA(G2:G))
Dies schlägt jedoch bei einigen Kombinationen von Leerzeichen fehl. ( 1 blank 1 blank 1
scheitert für mich.)
Der folgende Code funktioniert (siehe Naders Antwort und Jasons Kommentar ):
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Sie müssen jedoch darüber nachdenken, ob Sie einen bestimmten Bereich verwenden möchten COLUMNS
oder nicht ROWS
.
Wenn COLUMNS
jedoch durch ersetzt wird COUNT
, erhalte ich anscheinend eine zuverlässige, leere Implementierung von LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Und da COUNTA
der Filter eingebaut ist, können wir die Verwendung weiter vereinfachen
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Das ist etwas einfach und richtig. Und Sie müssen sich keine Gedanken darüber machen, ob Sie Zeilen oder Spalten zählen sollen. Und im Gegensatz zu Skriptlösungen wird es automatisch mit Änderungen an der Tabelle aktualisiert.
Und wenn Sie den letzten Wert in einer Zeile erhalten möchten, ändern Sie einfach den Datenbereich:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Um den letzten Wert aus einer Spalte mit Textwerten zurückzugeben, müssen Sie COUNTA verwenden. Daher benötigen Sie die folgende Formel:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
Kombination mit INDEX
nicht der letzte Wert in der Spalte zurückgegeben.
Versuche dies:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Angenommen, die Spalte, in der Sie nach dem letzten Wert suchen, ist B.
Und ja, es funktioniert mit Leerzeichen.
Es sieht so aus, als ob Google Apps Script jetzt Bereiche als Funktionsparameter unterstützt. Diese Lösung akzeptiert einen Bereich:
// 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;
}
Siehe auch Diskussion im Google Apps Script-Hilfeforum: Wie erzwinge ich die Neuberechnung von Formeln?
Ich habe mir die vorherigen Antworten angesehen und sie scheinen zu hart zu arbeiten. Vielleicht hat sich die Skriptunterstützung einfach verbessert. Ich denke, die Funktion wird folgendermaßen ausgedrückt:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
In meiner Tabelle verwende ich dann:
= lastValue(E17:E999)
In der Funktion erhalte ich ein Array von Werten mit einem pro referenzierter Zelle, und dies iteriert nur vom Ende des Arrays rückwärts, bis ein nicht leerer Wert gefunden wird oder keine Elemente mehr vorhanden sind. Blattreferenzen sollten interpretiert werden, bevor die Daten an die Funktion übergeben werden. Auch nicht schick genug, um mit mehreren Dimensionen umzugehen. Die Frage hat nach der letzten Zelle in einer einzelnen Spalte gefragt, daher scheint sie zu passen. Es wird wahrscheinlich sterben, wenn Ihnen auch die Daten ausgehen.
Ihr Kilometerstand kann variieren, aber das funktioniert bei mir.
Dies erhält den letzten Wert und behandelt leere Werte:
=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()))) ) ) )
Die Antwort
$ =INDEX(G2:G; COUNT(G2:G))
funktioniert in LibreOffice nicht richtig. Mit einer kleinen Änderung funktioniert es jedoch perfekt.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Es funktioniert immer nur, wenn der wahre Bereich kleiner als ist (G2:G10000)
Ist es akzeptabel, die ursprüngliche Frage mit einer streng vom Thema abweichenden Antwort zu beantworten :) Sie können dazu eine Formel in die Tabelle schreiben. Hässlich vielleicht? aber effektiv im normalen Betrieb einer Tabelle.
=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
Dies wird als Gedanke für eine Reihe von Fragen im Skriptbereich angeboten, die zuverlässig mit Array-Formeln geliefert werden können, die den Vorteil haben, dass sie in Excel und Openoffice häufig auf ähnliche Weise arbeiten.
Ich habe mit dem von @tinfini angegebenen Code gespielt und dachte, die Leute könnten von einer meiner Meinung nach etwas eleganteren Lösung profitieren (beachten Sie, dass Skripte bei der Erstellung der ursprünglichen Antwort nicht ganz so funktionierten) ...
//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]);
}
Im Gebrauch würde es so aussehen:
=LastInRange(D2:D)
In Bezug auf den Kommentar von @ Jon_Schneider verwenden Sie einfach COUNTA () , wenn die Spalte leere Zellen enthält.
=INDEX(G2:G; COUNT**A**(G2:G))
Ich habe einen anderen Weg gefunden, vielleicht hilft er Ihnen
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-wird die letzte Zeile zurückgeben
Weitere Informationen von anab hier: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Ich bin überrascht, dass noch nie jemand diese Antwort gegeben hat. Aber dies sollte der kürzeste sein und es funktioniert sogar in Excel:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
Erstellt ein Array aus 1 / true (1) und 1 / false (0). Da LOOKUP
ein Top-Down-Ansatz zu finden ist 2
und Da es nie 2 findet, kommt es bis zur letzten nicht leeren Zeile und gibt die Position davon an.
Der andere Weg, dies zu tun, wie andere vielleicht erwähnt haben, ist:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Finden Sie das MAX
Imum ROW
der nicht leeren Reihe und füttern Sie esINDEX
In einem Null-Leerzeichen-Unterbrechungsarray ist die Verwendung der INDIRECT
RC
Notation mit COUNTBLANK
eine weitere Option. Wenn V4: V6 mit Einträgen belegt ist, dann
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
gibt die Position von V6 an.
Tools -> Scripts -> Script editor...