Wybór ostatniej wartości kolumny


Odpowiedzi:


54

Więc to rozwiązanie przyjmuje łańcuch jako parametr. Znajduje liczbę wierszy w arkuszu. Pobiera wszystkie wartości w określonej kolumnie. Przechodzi przez wartości od końca do początku, dopóki nie znajdzie wartości, która nie jest pustym ciągiem. Wreszcie odzyskuje wartość.

Scenariusz:

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];
}

Stosowanie:

=lastValue("G")

EDYTOWAĆ:

W odpowiedzi na komentarz z prośbą o automatyczną aktualizację funkcji:

Najlepszym sposobem, jaki mogłem znaleźć, jest użycie tego z powyższym kodem:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

Nie byłoby już wymagane używanie funkcji w komórce, tak jak w sekcji Użycie . Zamiast tego na sztywno kodujesz komórkę, którą chcesz zaktualizować, i kolumnę, którą chcesz śledzić. Możliwe, że istnieje bardziej elokwentny sposób na wdrożenie tego (miejmy nadzieję, że nie jest on zakodowany na stałe), ale jest to najlepszy, jaki na razie znalazłem.

Zauważ, że jeśli użyjesz funkcji w komórce, jak wspomniano wcześniej, zaktualizuje się ona po ponownym załadowaniu. Może jest sposób na podłączenie się onEdit()i wymuszenie aktualizacji funkcji komórki. Po prostu nie mogę znaleźć tego w dokumentacji.


5
To jest skrypt arkusza kalkulacyjnego Google. Możesz stworzyć nowy skrypt podTools -> Scripts -> Script editor...
tinifni

1
: O to niesamowite! Nie wiedziałem, że Google ma zaimplementowane skrypty. Dziękuję bardzo, zadziałało idealnie
cambraca

1
masz jakiś pomysł, jak sprawić, by aktualizował się automatycznie, gdy zmienię dane w arkuszu?
cambraca

Zredagowałem odpowiedź, podając informacje, które powinny pomóc. Miłego kodowania!
tinifni

5
Dokonałem edycji tego skryptu, dzięki czemu możesz przekazywać do niego nazwane arkusze, takie jak lastValue ("Sheet1! A") gist.github.com/2701061
johnwards

165

Podobna odpowiedź do odpowiedzi Caligari , ale możemy to uporządkować, po prostu określając pełny zakres kolumn:

=INDEX(G2:G, COUNT(G2:G))

12
Wygląda na to, że działa, o ile w zbiorze danych nie ma żadnych
spacji

Innym dobrym źródłem jest wybrana odpowiedź na productforums.google.com/forum/#!topic/docs/p3t3feg7Jic, która pokazuje, jak uzyskać pierwszy, ostatni lub n-ty wiersz w FILTER()zakresie ed, podobnie jak odpowiedź @ Geta .
Aaron Blenkush,

Ta odpowiedź stackoverflow.com/a/8161172/418111 zawiera formułę obsługującą puste komórki.
Daniel

8
Jak wspomniał @KeithSirmons. Jeśli w kolumnie są spacje, nie działa, ponieważ COUNT(G2:G)zwraca 0. Zamiast tego użyj tego, COUNTA(G2:G)który liczy tylko liczbę wartości w zbiorze danych. COUNTAprzydaje się tylko w połączeniu z, INDEXaby uzyskać ostatnią wartość, jeśli między wartościami nie ma ani jednej spacji.
Christiaan Westerbeek,

3
Zwróć również uwagę, jeśli twoje wartości nie są liczbami, będziesz potrzebować COUNTA. COUNTzlicza tylko wartości liczbowe: zwróci 0, gdy zostanie podana np. komórki tekstowe.
Air

53

Właściwie znalazłem tutaj prostsze rozwiązanie:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=en

To wygląda tak:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))

2
Wow, to jest niesamowicie czyste. Czy możesz wyjaśnić dokładnie, jak to działa?
cambraca,

Niezupełnie: jest dobrze, gdy zakres źródeł jest już posortowany.
caligari

5
Wyjaśnione: ROWzwraca numer wiersza, więc FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )zwraca tablicę wszystkich niepustych numerów wierszy (nie ich wartości), na przykład [1, 2, 3, 7, 12, 14]. Następnie MAXpodaje numer ostatniego rzędu. FILTERNastępnie stosowana jest sekunda w celu odfiltrowania wszystkich wierszy, w których numer wiersza nie odpowiada wartości z MAX(tj. Wartości ostatniego niepustego wiersza).
jhabbott

Oba wystąpienia WIERSZ można zastąpić KOLUMNĄ, aby zwrócić ostatnią wartość w określonym wierszu (zamiast ostatniej wartości w określonej kolumnie).
Jon Schneider,

2
A co jeśli chciałbym podać numer wiersza ostatniej wartości kolumny?
Nick5a1

44

Funkcja LAST () nie jest obecnie zaimplementowana w celu wybrania ostatniej komórki w zakresie. Jednak idąc za przykładem:

=LAST(G2:G9999)

jesteśmy w stanie uzyskać ostatnią komórkę za pomocą kilku funkcji INDEX () i COUNT () w ten sposób:

=INDEX(G2:G; COUNT(G2:G))

W arkuszu spreedsheet znajduje się przykład na żywo, w którym znalazłem (i rozwiązałem) ten sam problem (arkusz Orzamentos, komórka I5). Zwróć uwagę, że działa idealnie nawet w odniesieniu do innych arkuszy w dokumencie.


1
Działa to świetnie i automatycznie aktualizuje się wraz ze zmianami arkusza. Dzięki!
TinaMarie

8
Podoba mi się zwięzłość tej sugestii, ale wydaje się, że nie działa, gdy zakres docelowy zawiera puste komórki (jak wspomniano w pierwotnym pytaniu powyżej), ponieważ COUNT () nie liczy pustych komórek.
Jon Schneider

@JonSchneider możesz użyć COUNTAw takim przypadku, jeśli masz pewność, że między wartościami w kolumnie nie ma ani jednej spacji . Zobacz moje komentarze do odpowiedzi dohmoose.
Christiaan Westerbeek,

Dlaczego :Goznacza ostatni element? Czy to jest udokumentowane?
flow2k

33

Podsumowanie:

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

Detale:

Przejrzałem i wypróbowałem kilka odpowiedzi i oto, co znalazłem: Najprostsze rozwiązanie (patrz odpowiedź Dohmoose ) działa, jeśli nie ma żadnych spacji:

=INDEX(G2:G; COUNT(G2:G))

Jeśli masz puste miejsca, nie powiedzie się.

Możesz obsłużyć jeden pusty, zmieniając po prostu z COUNTna COUNTA (patrz odpowiedź użytkownika3280071 ):

=INDEX(G2:G; COUNTA(G2:G))

Jednak to się nie powiedzie w przypadku niektórych kombinacji spacji. ( 1 blank 1 blank 1mi się nie udaje.)

Poniższy kod działa (zobacz odpowiedź Nadera i komentarz Jasona ):

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

ale wymaga zastanowienia się, czy chcesz użyć, COLUMNSczy ROWSdla danego zakresu.

Jeśli jednak COLUMNSzostanie zastąpione przez COUNT, wydaje się, że otrzymuję niezawodną, ​​odporną na puste implementację LAST:

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

A ponieważ COUNTAma wbudowany filtr, możemy uprościć dalsze korzystanie

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

Jest to dość proste i poprawne. I nie musisz się martwić, czy liczyć wiersze, czy kolumny. W przeciwieństwie do rozwiązań skryptowych aktualizuje się automatycznie wraz ze zmianami w arkuszu kalkulacyjnym.

A jeśli chcesz uzyskać ostatnią wartość w wierszu, po prostu zmień zakres danych:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )

Bardzo pomocne, aby przejść przez kroki i funkcjonalność + ograniczenia każdej iteracji. Musiałem uzyskać ostatnią wartość w każdym wierszu, niektóre z wieloma spacjami. To zadziałało jak urok. Dziękuję Ci!
Christiaan Adams

9

Aby zwrócić ostatnią wartość z kolumny wartości tekstowych, musisz użyć COUNTA, więc potrzebujesz tej formuły:

=INDEX(G2:G; COUNTA(G2:G))

1
Ale tylko wtedy, gdy między wartościami nie ma ani jednej spacji. Jeśli tak, w COUNTApołączeniu z INDEXnie zwróci ostatniej wartości w kolumnie.
Christiaan Westerbeek,

7

Spróbuj tego: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Załóżmy, że kolumną, w której szukasz ostatniej wartości, jest B.

I tak, działa ze spacjami.


6

Wygląda na to, że Google Apps Script obsługuje teraz zakresy jako parametry funkcji. To rozwiązanie akceptuje zakres:

// 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;
}

Zobacz także dyskusję na forum pomocy Google Apps Script: Jak wymusić ponowne obliczenie formuł?


6

Spojrzałem na poprzednie odpowiedzi i wyglądało na to, że pracują zbyt ciężko. Może po prostu poprawiła się obsługa skryptów. Myślę, że funkcja jest wyrażona w ten sposób:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

W moim arkuszu kalkulacyjnym używam:

= lastValue(E17:E999)

W funkcji otrzymuję tablicę wartości z jedną na komórkę, do której istnieje odwołanie, i to po prostu iteruje od końca tablicy do tyłu, aż znajdzie niepustą wartość lub zabraknie elementów. Odniesienia do arkuszy powinny być interpretowane przed przekazaniem danych do funkcji. Nie na tyle wyszukane, aby obsługiwać wiele wymiarów. Pytanie dotyczyło ostatniej komórki w jednej kolumnie, więc wydaje się, że pasuje. Prawdopodobnie umrze, jeśli zabraknie też danych.

Twój przebieg może się różnić, ale to działa dla mnie.


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

bez twardego kodowania.


5

Ten działa dla mnie:

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

Fajne rozwiązanie, które działa również w obecności pustych komórek.
jochen

5

Pobiera ostatnią wartość i obsługuje puste wartości:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )

działa również dla kolumn. Po prostu podstawiłem kilka rzeczy. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason

ogólne rozwiązanie:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason

Dla mnie jest to „właściwa” odpowiedź. Dość zwarty i łatwy do zrozumienia oraz działa ze spacjami.
aardvarkk

4

W kolumnie ze spacjami można uzyskać ostatnią wartość za pomocą

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

Fajne rozwiązanie. Podejrzewam jednak, że wariant @ Pedro (używający INDEX i MAX) może być nieco bardziej wydajny niż użycie SORT.
jochen

4

Odpowiedź

$ =INDEX(G2:G; COUNT(G2:G))

nie działa poprawnie w LibreOffice. Jednak z niewielką zmianą działa idealnie.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

Działa zawsze tylko wtedy, gdy rzeczywisty zakres jest mniejszy niż (G2:G10000)


Ten post został oznaczony jako „Arkusz kalkulacyjny Google” i „Skrypt Google Apps”, nic związanego z Libre Office… nie masz tematu
Serge insas

Niezbyt odległy temat, ponieważ tytuł pytania, Wybór ostatniej wartości kolumny , może łatwo znaleźć biedna dusza za pomocą LibreOffice lub Numbers. Jestem amatorem arkuszy kalkulacyjnych, który wie wystarczająco dużo, by być niebezpiecznym. Mogę stwierdzić, że Google stworzyło to tak, że jeśli twój drugi argument do zakresu jest tylko kolumną, wybierze pozostałą część kolumny, aby ludzie nie musieli używać bardzo dużej liczby hacków, którą odkryłeś.
Aaron

3

Czy można odpowiedzieć na pierwotne pytanie, udzielając odpowiedzi ściśle spoza tematu :) Możesz w tym celu napisać wzór w arkuszu kalkulacyjnym. Może brzydki? ale skuteczne w normalnym działaniu arkusza kalkulacyjnego.

=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

Jest to przemyślenie na szereg pytań w obszarze skryptów, które można wiarygodnie dostarczyć za pomocą formuł tablicowych, które mają tę zaletę, że często działają w podobny sposób w programie Excel i Openoffice.


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

Bawiłem się kodem podanym przez @tinfini i pomyślałem, że ludzie mogą skorzystać z tego, co uważam za nieco bardziej eleganckie rozwiązanie (uwaga, nie sądzę, aby skrypty działały tak samo, gdy tworzył oryginalną odpowiedź) ...

//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]);
}

W użyciu wyglądałoby to tak:

=LastInRange(D2:D)

2

Odnośnie komentarza @ Jon_Schneider, jeśli kolumna ma puste komórki, po prostu użyj COUNTA ()

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

4
Nie, to też nie działa. Różnica między COUNT a COUNTA polega na rozróżnieniu między liczbami a tekstem, co nie ma tutaj znaczenia.
mhsmith


2

Znalazłem niewielką zmianę, która działała, aby wyeliminować puste miejsca na dole tabeli. = indeks (G2: G, LICZ.JEŻELI (G2: G; „<>”))


1

Dziwię się, że nikt wcześniej nie udzielił takiej odpowiedzi. Ale to powinno być najkrótsze i działa nawet w programie Excel:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>""tworzy tablicę 1 / prawda (1) i 1 / fałsz (0). Ponieważ LOOKUPstosuje podejście odgórne w celu znalezienia 2i Ponieważ nigdy nie znajdzie 2, dochodzi do ostatniego niepustego wiersza i podaje jego pozycję.

Innym sposobem, aby to zrobić, jak mogli wspomnieć inni, jest:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Znalezienie MAXimum ROWniepustego wiersza i podanie goINDEX

W tablicy z zerową pustą przerwaniem kolejną opcją jest użycie INDIRECT RCnotacji z COUNTBLANK. Jeśli V4: V6 jest zajęty wpisami, to

V18 :

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

poda pozycję V6.


1

aby uzyskać ostatnią wartość z kolumny, możesz również użyć MAXfunkcji z IFfunkcją

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.