wake-up-neo.net

Auswahl des letzten Wertes einer Spalte

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.

106
cambraca

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.

54
tinifni

Ä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))
163
dohmoose

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

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.

43
caligari

Zusammenfassung:

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

Einzelheiten:

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) )
29
Doug Bradshaw

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

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.

7
Andrew Anderson

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?

6
craig3353

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.

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

keine harte Kodierung.

5
desnyki

Dieser arbeitet für mich:

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

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

In einer Spalte mit Leerzeichen können Sie mit den letzten Wert erhalten

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

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)

4
Manuel Ferreira

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.

3
DavidF

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)
3
Jonathan Cavell
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());
3
Marian

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

2
irriss

Es wurde eine kleine Variation gefunden, mit der Leerzeichen am unteren Rand der Tabelle entfernt wurden. = Index (G2: G, COUNTIF (G2: G, "<>"))

2
Chris

In Bezug auf @ Jon_Schneiders Kommentar verwenden Sie COUNTA (), wenn die Spalte leere Zellen enthält

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

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 MAXimums ROW der nicht leeren Zeile und Weiterleiten an INDEX

In einem Null-Leerzeichen-Unterbrechungsarray ist die Verwendung der INDIRECTRC -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.

1
TheMaster

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