Ich habe eine Tabelle mit einigen Werten in Spalte G. Einige Zellen sind dazwischen leer, und ich muss den letzten Wert aus dieser Spalte in eine andere Zelle übertragen.
So etwas wie:
=LAST(G2:G9999)
außer dass LAST
keine Funktion ist.
Diese Lösung verwendet also einen String als Parameter. Es wird ermittelt, wie viele Zeilen sich auf dem Blatt befinden. Es werden alle Werte in der angegebenen Spalte abgerufen. Die Werte werden vom Ende bis zum Anfang durchlaufen, bis ein Wert gefunden wird, der keine leere Zeichenfolge ist. Schließlich gibt es den Wert zurück.
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")
EDIT:
Als Antwort auf den Kommentar, in dem die automatische Aktualisierung der Funktion angefordert wird:
Der beste Weg, den ich finden könnte, 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 wie den Abschnittszuständen sage zu verwenden. 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 umzusetzen (hoffentlich einen, der nicht hart codiert ist), aber dies ist der beste, den ich derzeit finden kann.
Beachten Sie, dass die Funktion beim erneuten Laden aktualisiert wird, wenn Sie die zuvor angegebene Funktion in der Zelle verwenden. Möglicherweise gibt es eine Möglichkeit, sich in onEdit()
einzuhängen und die Aktualisierung von Zellenfunktionen zu erzwingen. Ich kann es einfach nicht in der Dokumentation finden.
Ähnliche Antwort zu Caligaris Antwort , aber wir können es aufräumen, indem wir nur den gesamten Spaltenbereich angeben:
=INDEX(G2:G, COUNT(G2:G))
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)))))
Die Funktion LAST () ist derzeit nicht implementiert, um die letzte Zelle innerhalb eines Bereichs auszuwählen. Folgen Sie jedoch Ihrem Beispiel:
=LAST(G2:G9999)
wir können die letzte Zelle mit den Funktionen INDEX () und COUNT () auf folgende Weise erhalten:
=INDEX(G2:G; COUNT(G2:G))
Es gibt ein Live-Beispiel in der Tabelle, in der ich das gleiche Problem gefunden (und gelöst) habe (Tabelle Orzamentos
, Zelle I5
). Beachten Sie, dass es auch mit Bezug auf andere Blätter im Dokument einwandfrei funktioniert.
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Ich habe mehrere Antworten durchgesehen und ausprobiert und Folgendes 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 ein Leerzeichen behandeln, indem Sie einfach von COUNT
zu COUNTA
wechseln (Siehe ser3280071's answer ):
=INDEX(G2:G; COUNTA(G2:G))
Bei einigen Kombinationen von Leerzeichen schlägt dies jedoch 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 überlegen, ob Sie COLUMNS
oder ROWS
für einen bestimmten Bereich verwenden möchten.
Wenn jedoch COLUMNS
durch COUNT
ersetzt wird, 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
den Filter eingebaut hat, 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. Im Gegensatz zu Skriptlösungen wird es automatisch aktualisiert, wenn Änderungen an der Tabelle vorgenommen werden.
Und wenn Sie den letzten Wert in einer Reihe 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 diese Formel:
=INDEX(G2:G; COUNTA(G2:G))
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.
Offenbar unterstützt Google Apps Script jetzt Bereiche als Funktionsparameter. 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 die Diskussion im Google Apps Script-Hilfeforum: Wie erzwinge ich eine 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 Wert pro referenzierter Zelle, und dies iteriert nur vom Ende des Arrays abwärts, bis ein nicht leerer Wert gefunden wird oder keine Elemente mehr vorhanden sind. Blattverweise sollten interpretiert werden, bevor die Daten an die Funktion übergeben werden. Auch nicht ausgefallen genug, um mit Mehrdimensionen umzugehen. Die Frage hat nach der letzten Zelle in einer einzelnen Spalte gefragt, also scheint sie zu passen. Es wird wahrscheinlich sterben, wenn Sie keine Daten mehr haben.
Ihr Kilometerstand kann variieren, aber das funktioniert bei mir.
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
keine harte Kodierung.
Dieser arbeitet für mich:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
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)) ) ) )
In einer Spalte mit Leerzeichen können Sie mit den letzten Wert erhalten
=+sort(G:G,row(G:G)*(G:G<>""),)
Die Antwort
$ =INDEX(G2:G; COUNT(G2:G))
funktioniert in LibreOffice nicht richtig. Mit einer kleinen Änderung funktioniert es jedoch einwandfrei.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Es funktioniert immer nur, wenn der wahre Bereich kleiner ist als (G2:G10000)
Ist es akzeptabel, die ursprüngliche Frage mit einer Antwort zu beantworten, die nicht zum Thema gehört :) Sie können eine Formel in die Tabelle schreiben, um dies zu tun. Hässlich vielleicht? aber effektiv im normalen Betrieb einer Tabellenkalkulation.
=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 Überlegung 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 häufig in Excel und Openoffice auf ähnliche Weise funktionieren.
Ich habe mit dem Code von @tinfini gespielt und dachte, die Leute könnten von einer meiner Meinung nach etwas eleganteren Lösung profitieren (Anmerkung: Ich glaube nicht, dass Skripte genauso funktionierten, als er die ursprüngliche Antwort erstellte) ...
//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)
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());
Ich habe einen anderen Weg gefunden, vielleicht hilft es dir
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-gibt die letzte Zeile zurück
Weitere Informationen von anab finden Sie hier: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Es wurde eine kleine Variation gefunden, mit der Leerzeichen am unteren Rand der Tabelle entfernt wurden. = Index (G2: G, COUNTIF (G2: G, "<>"))
In Bezug auf @ Jon_Schneiders Kommentar verwenden Sie COUNTA (), wenn die Spalte leere Zellen enthält
=INDEX(G2:G; COUNT**A**(G2:G))
Ich bin überrascht, dass noch nie jemand diese Antwort gegeben hat. Dies sollte aber die kürzeste sein und es funktioniert sogar in Excel:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
erstellt ein Array von 1/true (1) und 1/false (0). Da LOOKUP
einen Top-Down-Ansatz ausführt, um 2
und Da es niemals 2 finden wird, kommt es bis zur letzten nicht leeren Zeile und gibt deren Position an.
Der andere Weg, dies zu tun, ist, wie andere vielleicht erwähnt haben,:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Ermitteln des MAX
imums ROW
der nicht leeren Zeile und Weiterleiten an INDEX
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)
wird die Position von V6 geben.
um den letzten Wert aus einer Spalte zu erhalten, können Sie auch die Funktion MAX
mit der Funktion IF
verwenden
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))