Selezione dell'ultimo valore di una colonna


Risposte:


54

Quindi questa soluzione prende una stringa come parametro. Trova quante righe ci sono nel foglio. Ottiene tutti i valori nella colonna specificata. Passa attraverso i valori dalla fine all'inizio finché non trova un valore che non sia una stringa vuota. Alla fine ritorna il valore.

script:

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

Uso:

=lastValue("G")

MODIFICARE:

In risposta al commento che richiede l'aggiornamento automatico della funzione:

Il modo migliore che ho potuto trovare è usarlo con il codice sopra:

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

Non sarebbe più necessario utilizzare la funzione in una cella come afferma la sezione Utilizzo . Invece stai codificando la cella che desideri aggiornare e la colonna che desideri monitorare. È possibile che ci sia un modo più eloquente per implementarlo (si spera uno che non sia hardcoded), ma questo è il meglio che sono riuscito a trovare per ora.

Nota che se usi la funzione nella cella come indicato in precedenza, si aggiornerà al ricaricamento. Forse c'è un modo per agganciarsi onEdit()e forzare l'aggiornamento delle funzioni della cella. Non riesco proprio a trovarlo nella documentazione.


5
Questo è uno script del foglio di lavoro di Google. Puoi creare un nuovo script inTools -> Scripts -> Script editor...
tinifni

1
: Oh è fantastico! Non sapevo che Google avesse implementato gli script. Grazie mille, ha funzionato perfettamente
cambraca

1
qualche idea su come farlo aggiornare automaticamente quando cambio i dati nel foglio?
cambraca

Ho modificato la mia risposta con alcune informazioni che dovrebbero aiutare. Buona programmazione!
tinifni

5
Ho apportato una modifica a questo script in modo che tu possa passarvi fogli con nome come lastValue ("Sheet1! A") gist.github.com/2701061
johnwards

165

Risposta simile alla risposta di caligari , ma possiamo riordinarla semplicemente specificando l'intero intervallo di colonne:

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

12
Sembra funzionare finché non ci sono spazi vuoti nel set di dati
Keith Sirmons

Un'altra buona risorsa è la risposta selezionata su productforums.google.com/forum/#!topic/docs/p3t3feg7Jic che mostra come ottenere la prima, l'ultima o l'ennesima riga in un FILTER()intervallo ed, simile alla risposta di @ Geta .
Aaron Blenkush

Questa risposta stackoverflow.com/a/8161172/418111 ha una formula che supporta le celle vuote.
Daniel

8
Come menzionato da @KeithSirmons. Se sono presenti spazi vuoti nella colonna, non funziona, perché COUNT(G2:G)restituisce 0. Utilizza invece COUNTA(G2:G)quello che conta solo il numero di valori in un set di dati. COUNTAè utile solo in combinazione con INDEXper ottenere l'ultimo valore se non c'è un singolo spazio tra i valori.
Christiaan Westerbeek

3
Nota anche se i tuoi valori non sono numerici, ti serviranno COUNTA. COUNTconta solo valori numerici: restituirà 0 quando viene fornito, ad esempio celle di testo.
Aria

53

In realtà ho trovato una soluzione più semplice qui:

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

Assomiglia a questo:

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

2
Wow, è incredibilmente pulito. Puoi spiegare esattamente come funziona?
cambraca

Non proprio: è giusto solo quando l'intervallo di origine è già ordinato.
caligari

5
Spiegato: ROWrestituisce il numero di riga, quindi FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )restituisce un array di tutti i numeri di riga non vuoti (non i loro valori), ad esempio [1,2, 3, 7, 12, 14]. Poi MAXci dà l'ultimo numero di riga. Viene FILTERquindi applicato un secondo per filtrare tutte le righe in cui il numero di riga non corrisponde al valore da MAX(cioè il valore dell'ultima riga non vuota).
jhabbott

Entrambe le istanze di ROW possono essere sostituite da COLUMN per restituire l'ultimo valore in una determinata riga (invece dell'ultimo valore in una determinata colonna).
Jon Schneider

2
E se volessi solo il numero di riga dell'ultimo valore della colonna?
Nick5a1

44

La funzione LAST () non è attualmente implementata per selezionare l'ultima cella all'interno di un intervallo. Tuttavia, seguendo il tuo esempio:

=LAST(G2:G9999)

siamo in grado di ottenere l'ultima cella utilizzando la coppia di funzioni INDEX () e COUNT () in questo modo:

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

C'è un esempio dal vivo nello spreedsheet in cui ho trovato (e risolto) lo stesso problema (foglio Orzamentos, cella I5). Si noti che funziona perfettamente anche facendo riferimento ad altri fogli all'interno del documento.


1
Funziona alla grande e si aggiorna automaticamente man mano che il foglio cambia. Grazie!
TinaMarie

8
Mi piace la concisione di questo suggerimento, ma non sembra funzionare quando l'intervallo di destinazione include alcune celle vuote (come menzionato nella domanda originale sopra), poiché COUNT () non conta le celle vuote.
Jon Schneider

@JonSchneider puoi usare COUNTAin quel caso se sei sicuro che non ci sia un singolo spazio tra i valori nella colonna. Vedi i miei commenti alla risposta di dohmoose.
Christiaan Westerbeek

Perché :Gdenota l'ultimo elemento? È documentato?
flow2k

33

Sommario:

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

Dettagli:

Ho esaminato e provato diverse risposte, ed ecco cosa ho trovato: La soluzione più semplice (vedi la risposta di Dohmoose ) funziona se non ci sono spazi vuoti:

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

Se hai spazi vuoti, fallisce.

Puoi gestire uno spazio vuoto semplicemente cambiando da COUNTa COUNTA (Vedi la risposta di user3280071 ):

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

Tuttavia, questo fallirà per alcune combinazioni di spazi vuoti. ( 1 blank 1 blank 1fallisce per me.)

Il codice seguente funziona (vedi la risposta di Nader e il commento di jason ):

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

ma richiede di pensare se si desidera utilizzare COLUMNSo ROWSper un determinato intervallo.

Tuttavia, se COLUMNSviene sostituito con COUNTmi sembra di ottenere un'implementazione affidabile ea prova di bianco di LAST:

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

E poiché COUNTAha il filtro integrato, possiamo semplificarne ulteriormente l'utilizzo

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

Questo è piuttosto semplice e corretto. E non devi preoccuparti se contare righe o colonne. E a differenza delle soluzioni di script, si aggiorna automaticamente con le modifiche al foglio di calcolo.

E se vuoi ottenere l'ultimo valore di fila, cambia semplicemente l'intervallo di dati:

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

Super utile per seguire i passaggi e le funzionalità + i limiti di ogni iterazione. Avevo bisogno di ottenere l'ultimo valore in ogni riga, alcuni con più spazi vuoti. Questo ha funzionato come un fascino. Grazie!
Christiaan Adams,

9

Per restituire l'ultimo valore da una colonna di valori di testo è necessario utilizzare CONTA.VALORI, quindi è necessaria questa formula:

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

1
Ma solo se non c'è un solo spazio vuoto tra i tuoi valori. Se è presente, COUNTAcombinato con INDEXnon restituirà l'ultimo valore nella colonna.
Christiaan Westerbeek

7

prova questo: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Supponiamo che la colonna in cui stai cercando l'ultimo valore sia B.

E sì, funziona con gli spazi vuoti.


6

Sembra che Google Apps Script ora supporti gli intervalli come parametri di funzione. Questa soluzione accetta una gamma:

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

Vedi anche la discussione nel forum di assistenza di Google Apps Script: come imposto il ricalcolo delle formule?


6

Ho guardato le risposte precedenti e sembra che stiano lavorando troppo. Forse il supporto agli script è semplicemente migliorato. Penso che la funzione sia espressa così:

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

Nel mio foglio di calcolo utilizzo quindi:

= lastValue(E17:E999)

Nella funzione, ottengo un array di valori con uno per cella di riferimento e questo si limita a scorrere dalla fine dell'array all'indietro finché non trova un valore non vuoto o esaurisce gli elementi. I riferimenti al foglio devono essere interpretati prima che i dati vengano passati alla funzione. Non abbastanza elegante per gestire le multi-dimensioni. La domanda ha chiesto l'ultima cella in una singola colonna, quindi sembra adattarsi. Probabilmente morirà anche se finisci i dati.

Il tuo chilometraggio può variare, ma per me funziona.


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

nessun hard coding.


5

Questo funziona per me:

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

Una bella soluzione, che funziona anche in presenza di celle vuote.
Jochen

5

Ottiene l'ultimo valore e gestisce i valori vuoti:

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

funziona anche per le colonne. Ho appena sostituito alcune cose. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
Jason

soluzione generica:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason

Per me questa è la risposta "giusta". Ragionevolmente compatto e facile da capire e funziona con gli spazi vuoti.
aardvarkk

4

In una colonna con spazi vuoti, puoi ottenere l'ultimo valore con

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

Una bella soluzione. Sospetto che la variante di @ Pedro (utilizzando INDEX e MAX) possa essere leggermente più efficiente rispetto all'utilizzo di SORT, però.
Jochen

4

La risposta

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

non funziona correttamente in LibreOffice. Tuttavia, con una piccola modifica, funziona perfettamente.

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

Funziona sempre solo se l'intervallo reale è inferiore a (G2:G10000)


Questo post è stato taggato "Google Spreadsheet" e "Google Apps Script", niente relativo a Libre Office ... sei fuori tema
Serge insas

Non molto lontano dall'argomento in quanto il titolo della domanda, Selezionare l'ultimo valore di una colonna , potrebbe essere facilmente trovato da qualche povera anima usando LibreOffice o Numbers. Sono un dilettante di fogli di calcolo che sa abbastanza per essere pericoloso. Quello che posso raccogliere è che Google ha fatto in modo che se il tuo secondo argomento di un intervallo è solo una colonna, selezionerà il resto della colonna in modo che le persone non debbano usare il numero molto grande di hack che hai scoperto.
Aaron

3

È accettabile rispondere alla domanda originale con una risposta rigorosamente fuori tema :) Puoi scrivere una formula nel foglio di calcolo per farlo. Brutto forse? ma efficace nel normale funzionamento di un foglio di calcolo.

=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

Questo è offerto come un pensiero per una serie di domande nell'area dello script che potrebbero essere fornite in modo affidabile con formule di matrice che hanno il vantaggio di lavorare spesso in modo simile in Excel e 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

Stavo giocando con il codice fornito da @tinfini e pensavo che le persone potessero trarre vantaggio da quella che penso sia una soluzione leggermente più elegante (nota che non credo che gli script funzionassero allo stesso modo quando ha creato la risposta originale) ...

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

In uso sarebbe simile a questo:

=LastInRange(D2:D)

2

Per quanto riguarda il commento di @ Jon_Schneider, se la colonna ha celle vuote usa semplicemente COUNTA ()

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

4
No, neanche questo funziona. La differenza tra COUNT e COUNTA sta nella distinzione tra numeri e testo, che qui è irrilevante.
mhsmith


2

Ho trovato una leggera variazione che ha funzionato per eliminare gli spazi vuoti dal fondo del tavolo. = Indice (G2: G, COUNTIF (G2: G, "<>"))


1

Sono sorpreso che nessuno abbia mai dato questa risposta prima. Ma questo dovrebbe essere il più breve e funziona anche in Excel:

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

G2:G<>""crea un array di 1 / true (1) e 1 / false (0). Poiché LOOKUPfa un approccio dall'alto verso il basso per trovare 2e Poiché non troverà mai 2, arriva fino all'ultima riga non vuota e fornisce la posizione di quella.

L'altro modo per farlo, come altri potrebbero aver detto, è:

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

Trovare l' MAXimum ROWdella riga non vuota e dargli da mangiareINDEX

In un array di interruzioni senza spazi vuoti, un'altra opzione è Usare la INDIRECT RCnotazione con COUNTBLANK. Se V4: V6 è occupato da voci, allora,

V18 :

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

darà la posizione di V6.


1

per ottenere l'ultimo valore da una colonna puoi anche usare MAXfunction con IFfunction

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.