Auswahl des letzten Wertes einer Spalte


Antworten:


54

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.


5
Dies ist ein Google Spreadsheet-Skript. Sie können ein neues Skript unterTools -> Scripts -> Script editor...
tinifni

1
: O das ist unglaublich! Ich wusste nicht, dass Google Skripte implementiert hat. Vielen Dank, es hat perfekt funktioniert
Cambraca

1
Haben Sie eine Idee, wie Sie es automatisch aktualisieren können, wenn ich die Daten im Blatt ändere?
Cambraca

Ich habe meine Antwort mit einigen Informationen bearbeitet, die helfen sollten. Viel Spaß beim Codieren!
Tinifni

5
Ich habe dieses Skript bearbeitet, damit Sie benannte Blätter wie lastValue ("Sheet1! A") übergeben können. Gist.github.com/2701061
johnwards

165

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

12
Dies scheint zu funktionieren, solange der Datensatz keine Leerzeichen enthält
Keith Sirmons

Eine weitere gute Ressource ist die ausgewählte Antwort unter productforums.google.com/forum/#!topic/docs/p3t3feg7Jic, die zeigt, wie die erste, letzte oder n-te Zeile in einem FILTER()ed-Bereich abgerufen wird, ähnlich wie bei @ Getas Antwort .
Aaron Blenkush

Diese Antwort stackoverflow.com/a/8161172/418111 enthält eine Formel, die Leerzellen unterstützt.
Daniel

8
Wie @KeithSirmons erwähnt. 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. COUNTAist nur dann nützlich INDEX, wenn Sie den letzten Wert erhalten, wenn zwischen Ihren Werten kein einziges Leerzeichen steht.
Christiaan Westerbeek

3
Beachten Sie auch, wenn Ihre Werte nicht numerisch sind, benötigen Sie COUNTA. COUNTzählt nur numerische Werte: Es wird 0 zurückgegeben, wenn z. B. Textzellen angegeben werden.
Air

53

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

2
Wow das ist unglaublich sauber. Können Sie genau erklären, wie es funktioniert?
Cambraca

Nicht wirklich: Es ist genau dann richtig, wenn der Quellbereich bereits sortiert ist.
Caligari

5
Erklärt: ROWGibt 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 MAXgibt uns die letzte Zeilennummer. Eine Sekunde FILTERwird 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).
Jhabbott

Beide Instanzen von ROW können durch COLUMN ersetzt werden, um den letzten Wert in einer bestimmten Zeile (anstelle des letzten Werts in einer bestimmten Spalte) zurückzugeben.
Jon Schneider

2
Was wäre, wenn ich nur die Zeilennummer des letzten Werts der Spalte haben wollte?
Nick5a1

44

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.


1
Dies funktioniert hervorragend und wird automatisch aktualisiert, wenn sich das Blatt ändert. Vielen Dank!
TinaMarie

8
Ich mag die Prägnanz dieses Vorschlags, aber es scheint nicht zu funktionieren, wenn der Zielbereich einige leere Zellen enthält (wie in der ursprünglichen Frage oben erwähnt), da COUNT () keine leeren Zellen zählt.
Jon Schneider

@ JonSchneider können Sie COUNTAin diesem Fall verwenden, wenn Sie sicher sind, dass zwischen den Werten in der Spalte kein einziges Leerzeichen steht. Siehe meine Kommentare zu Dohmooses Antwort.
Christiaan Westerbeek

Warum :Gbezeichnet das letzte Element? Ist das dokumentiert?
Flow2k

33

Zusammenfassung:

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

Einzelheiten:

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 COUNTzu 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 1scheitert 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 COLUMNSoder nicht ROWS.

Wenn COLUMNSjedoch 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 COUNTAder 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) )

Super hilfreich, um die Schritte und Funktionen + Einschränkungen jeder Iteration durchzugehen. Ich musste den letzten Wert in jeder Zeile erhalten, einige mit mehreren Leerzeichen. Das hat wie ein Zauber gewirkt. Danke dir!
Christiaan Adams

9

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

1
Aber nur, wenn zwischen Ihren Werten kein einziges Leerzeichen steht. Wenn dies der Fall ist, wird in COUNTAKombination mit INDEXnicht der letzte Wert in der Spalte zurückgegeben.
Christiaan Westerbeek

7

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.


6

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?


6

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.


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

keine harte Codierung.


5

Dieser funktioniert für mich:

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

Eine schöne Lösung, die auch bei leeren Zellen funktioniert.
Jochen

5

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

funktioniert auch für Spalten. Ich habe nur ein paar Dinge ersetzt. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
Jason

generische Lösung:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
Jason

Für mich ist dies die "richtige" Antwort. Ziemlich kompakt und leicht zu verstehen und funktioniert mit Leerzeichen.
Erdferkel

4

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

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

Eine schöne Lösung. Ich vermute jedoch, dass die Variante von @ Pedro (mit INDEX und MAX) etwas effizienter ist als mit SORT.
Jochen

4

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)


Dieser Beitrag wurde mit "Google Spreadsheet" und "Google Apps Script" getaggt, nichts im Zusammenhang mit Libre Office ... Sie sind nicht zum Thema
Serge insas

Nicht besonders weit vom Thema entfernt, da der Titel der Frage, Auswahl des letzten Werts einer Spalte , von einer armen Seele mit LibreOffice oder Numbers leicht gefunden werden kann. Ich bin ein Tabellenkalkulations-Amateur, der genug weiß, um gefährlich zu sein. Was ich zusammenfassen kann, ist, dass Google es so gemacht hat, dass wenn Ihr zweites Argument für einen Bereich nur eine Spalte ist, es den Rest der Spalte auswählt, damit die Leute nicht den Hack mit der sehr großen Anzahl verwenden müssen, den Sie entdeckt haben.
Aaron

3

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.


3
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

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)

2

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

4
Nein, das funktioniert auch nicht. Der Unterschied zwischen COUNT und COUNTA liegt in der Unterscheidung zwischen Zahlen und Text, was hier irrelevant ist.
Mhsmith


2

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


1

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 LOOKUPein Top-Down-Ansatz zu finden ist 2und 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 MAXImum ROWder nicht leeren Reihe und füttern Sie esINDEX

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


1

Um den letzten Wert aus einer Spalte zu erhalten, können Sie auch MAXFunktion mit IFFunktion verwenden

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.