Selecionando o último valor de uma coluna

Respostas:

54

Portanto, esta solução usa uma string como parâmetro. Ele descobre quantas linhas existem na planilha. Ele obtém todos os valores da coluna especificada. Ele percorre os valores do final ao início até encontrar um valor que não seja uma string vazia. Finalmente, retorna o valor.

Roteiro:

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

EDITAR:

Em resposta ao comentário solicitando a atualização automática da função:

A melhor maneira que encontrei é usar isso com o código acima:

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

Não seria mais necessário usar a função em uma célula como os estados da seção Uso . Em vez disso, você está codificando a célula que deseja atualizar e a coluna que deseja rastrear. É possível que haja uma maneira mais eloquente de implementar isso (espero que não seja codificada), mas esta é a melhor que pude encontrar por enquanto.

Observe que se você usar a função na célula como afirmado anteriormente, ela será atualizada ao recarregar. Talvez haja uma maneira de conectar onEdit()e forçar a atualização das funções da célula. Simplesmente não consigo encontrar na documentação.

Tinifni
fonte
5
Este é um script de planilha do Google. Você pode criar um novo script emTools -> Scripts -> Script editor...
tinifni
1
: O que é incrível! Eu não sabia que o Google havia implementado scripts. Muito obrigado, funcionou perfeitamente
cambraca 18/11/10
1
alguma ideia de como fazer ele atualizar automaticamente quando eu mudar os dados da planilha?
cambraca
Editei minha resposta com algumas informações que devem ajudar. Boa codificação!
tinifni de
5
Fiz uma edição neste script para que você possa passar folhas nomeadas para ele, como lastValue ("Folha1! A") gist.github.com/2701061
johnwards
165

Resposta semelhante à resposta de caligari , mas podemos organizá-la apenas especificando o intervalo completo da coluna:

=INDEX(G2:G, COUNT(G2:G))
dohmoose
fonte
12
Isso parece funcionar, desde que não haja espaços em branco no conjunto de dados
Keith Sirmons
Outro bom recurso é a resposta selecionada pelo productforums.google.com/forum/#!topic/docs/p3t3feg7Jic que mostra como obter o primeiro, último, ou enésima linha em uma FILTER()gama ed, semelhante à resposta da @ Geta .
Aaron Blenkush
Esta resposta stackoverflow.com/a/8161172/418111 tem uma fórmula que oferece suporte a células em branco.
Daniel,
8
Como @KeithSirmons mencionado. Se houver espaços em branco na coluna, isso não funciona, porque COUNT(G2:G)retorna 0. Em vez disso, use COUNTA(G2:G)isso que conta apenas o número de valores em um conjunto de dados. COUNTAsó é útil quando combinado com INDEXpara obter o último valor se não houver um único espaço em branco entre seus valores.
Christiaan Westerbeek
3
Observe também se seus valores não são numéricos, você precisará COUNTA. COUNTsó conta valores numéricos: ele retornará 0 quando fornecido, por exemplo, células de texto.
ar em
53

Na verdade, encontrei uma solução mais simples aqui:

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

Se parece com isso:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
Getas
fonte
2
Uau, isso é incrivelmente limpo. Você pode explicar exatamente como funciona?
cambraca
Na verdade, não: é correto apenas quando o intervalo de origem já está classificado.
caligari
5
Explicado: ROWretorna o número da linha, então FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )retorna uma matriz de todos os números de linha não em branco (não seus valores), por exemplo [1,2, 3, 7, 12, 14]. Em seguida, MAXnos dá o número da última linha. Um segundo FILTERé então aplicado para filtrar todas as linhas onde o número da linha não corresponde ao valor MAX(ou seja, o valor da última linha não vazia).
jhabbott 01 de
Ambas as instâncias de ROW podem ser substituídas por COLUMN para retornar o último valor em uma linha específica (em vez do último valor em uma coluna específica).
Jon Schneider
2
E se eu quisesse apenas o número da linha do último valor da coluna?
Nick5a1,
44

A função LAST () não está implementada no momento para selecionar a última célula dentro de um intervalo. No entanto, seguindo seu exemplo:

=LAST(G2:G9999)

somos capazes de obter a última célula usando o par de funções INDEX () e COUNT () desta forma:

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

Há um exemplo ao vivo na planilha onde encontrei (e resolvi) o mesmo problema (planilha Orzamentos, célula I5). Observe que funciona perfeitamente mesmo se referindo a outras planilhas do documento.

Caligari
fonte
1
Isso funciona muito bem e é atualizado automaticamente conforme a planilha muda. Obrigado!
TinaMarie
8
Eu gosto da concisão dessa sugestão, mas ela não parece funcionar quando o intervalo de destino inclui algumas células em branco (como mencionado na pergunta original acima), já que COUNT () não conta células em branco.
Jon Schneider
@JonSchneider você pode usar COUNTAnesse caso se tiver certeza de que não há um único espaço em branco entre os valores da coluna. Veja meus comentários para a resposta de dohmoose.
Christiaan Westerbeek
Por que :Gdenota o último elemento? Isso está documentado?
flow2k
33

Resumo:

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

Detalhes:

Procurei e tentei várias respostas e aqui está o que descobri: A solução mais simples (veja a resposta de Dohmoose ) funciona se não houver espaços em branco:

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

Se você tiver espaços em branco, ele falhará.

Você pode lidar com um espaço em branco apenas mudando de COUNTpara COUNTA (consulte a resposta do usuário 3280071 ):

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

No entanto, isso falhará para algumas combinações de espaços em branco. (1 blank 1 blank 1 falha para mim.)

O código a seguir funciona (veja a resposta de Nader e o comentário de Jason ):

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

mas requer pensar se você deseja usar COLUMNSouROWS para um determinado intervalo.

No entanto, se COLUMNSfor substituído por COUNT, pareço obter uma implementação confiável e à prova de branco de LAST:

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

E como COUNTAo filtro está embutido, podemos simplificar ainda mais usando

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

Isso é um tanto simples e correto. E você não precisa se preocupar em contar linhas ou colunas. E, ao contrário das soluções de script, ele é atualizado automaticamente com as alterações na planilha.

E se você quiser obter o último valor em uma linha, basta alterar o intervalo de dados:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Doug Bradshaw
fonte
Super útil para percorrer as etapas e funcionalidades + limitações de cada iteração. Eu precisava obter o último valor em cada linha, alguns com vários espaços em branco. Isso funcionou como um encanto. Obrigado!
Christiaan Adams
9

Para retornar o último valor de uma coluna de valores de texto, você precisa usar CONT.valores, portanto, você precisaria desta fórmula:

=INDEX(G2:G; COUNTA(G2:G))
user3280071
fonte
1
Mas apenas se não houver um único espaço em branco entre seus valores. Se houver, COUNTAcombinado com INDEXnão retornará o último valor da coluna.
Christiaan Westerbeek
7

tente isto: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Suponha que a coluna na qual você está procurando o último valor seja B.

E sim, funciona com espaços em branco.

Andrew Anderson
fonte
6

Parece que o Google Apps Script agora oferece suporte a intervalos como parâmetros de função. Esta solução aceita um intervalo:

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

Veja também a discussão no fórum de ajuda do Google Apps Script: Como faço para forçar o recálculo das fórmulas?

craig3353
fonte
6

Eu olhei para as respostas anteriores e elas parecem estar trabalhando muito. Talvez o suporte a scripts simplesmente tenha melhorado. Acho que a função é expressa assim:

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

Em minha planilha, eu uso:

= lastValue(E17:E999)

Na função, obtenho uma matriz de valores com um por célula referenciada e isso apenas itera do final da matriz para trás até encontrar um valor não vazio ou ficar sem elementos. As referências da planilha devem ser interpretadas antes que os dados sejam passados ​​para a função. Não é sofisticado o suficiente para lidar com dimensões múltiplas. A pergunta era feita para a última célula em uma única coluna, então parece caber. Provavelmente morrerá se você ficar sem dados também.

Sua milhagem pode variar, mas isso funciona para mim.

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

sem codificação rígida.

Desnyki
fonte
5

Este funciona para mim:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Pedro
fonte
Uma boa solução, que também funciona na presença de células vazias.
jochen
5

Isso obtém o último valor e lida com valores vazios:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
Nader
fonte
funciona para colunas também. Eu apenas substituí algumas coisas. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason
solução genérica:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason
Para mim, essa é a resposta "certa". Razoavelmente compacto e fácil de entender e funciona com espaços em branco.
aardvarkk
4

Em uma coluna com espaços em branco, você pode obter o último valor com

=+sort(G:G,row(G:G)*(G:G<>""),)
JPV
fonte
Uma boa solução. Eu suspeito que a variante do @Pedro (usando INDEX e MAX) pode ser um pouco mais eficiente do que usar SORT.
jochen
4

A resposta

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

não funciona corretamente no LibreOffice. No entanto, com uma pequena mudança, funciona perfeitamente.

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

Sempre funciona apenas se o intervalo verdadeiro for menor que (G2:G10000)

Manuel Ferreira
fonte
Esta postagem foi marcada como "Planilha do Google" e "Script do Google Apps", nada relacionado ao Libre Office ... você está fora do assunto
Serge insas
Não muito longe do assunto, pois o título da pergunta, Selecionando o último valor de uma coluna , poderia ser facilmente encontrado por alguma pobre alma usando o LibreOffice ou o Numbers. Sou um amador de planilhas que sabe o suficiente para ser perigoso. O que posso deduzir é que o Google fez com que, se o seu segundo argumento para um intervalo for apenas uma coluna, ele selecione o restante da coluna para que as pessoas não precisem usar o hack de número muito grande que você descobriu.
Aaron de
3

É aceitável responder à pergunta original com uma resposta estritamente fora do tópico :) Você pode escrever uma fórmula na planilha para fazer isso. Feio, talvez? mas eficaz no funcionamento normal de uma planilha.

=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

Isso é oferecido como uma reflexão para uma série de questões na área de script que podem ser entregues de forma confiável com fórmulas de matriz que têm a vantagem de muitas vezes funcionar de maneira semelhante no Excel e no openoffice.

DavidF
fonte
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());
Mariana
fonte
3

Eu estava brincando com o código fornecido por @tinfini e pensei que as pessoas poderiam se beneficiar do que considero uma solução um pouco mais elegante (note que não acho que os scripts funcionem da mesma forma quando ele criou a resposta original) ...

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

Em uso, ficaria assim:

=LastInRange(D2:D)
Jonathan Cavell
fonte
2

Em relação ao comentário de @Jon_Schneider, se a coluna tiver células em branco, use CONT.valores ()

=INDEX(G2:G; COUNT**A**(G2:G))
Pedro
fonte
4
Não, isso também não funciona. A diferença entre COUNT e COUNTA está na distinção entre números e texto, o que é irrelevante aqui.
mhsmith
2

Encontrou uma ligeira variação que funcionou para eliminar os espaços em branco da parte inferior da mesa. = índice (G2: G, CONT.SE (G2: G, "<>"))

Chris
fonte
1

Estou surpreso que ninguém nunca tenha dado essa resposta antes. Mas este deve ser o mais curto e até funciona no excel:

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

G2:G<>""cria uma matriz de 1 / verdadeiro (1) e 1 / falso (0). Uma vez que LOOKUPfaz uma abordagem de cima para baixo para encontrar2 e Como nunca encontrará 2, chega à última linha não em branco e fornece a posição dela.

A outra maneira de fazer isso, como outros podem ter mencionado, é:

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

Encontrar o MAXíndice ROWda linha não em branco e alimentá-loINDEX

Em uma matriz de interrupção em branco zero, Usar INDIRECT RCnotação com COUNTBLANK é outra opção. Se V4: V6 estiver ocupado com entradas, então,

V18 :

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

dará a posição de V6.

O mestre
fonte
1

para obter o último valor de uma coluna, você também pode usar MAXfunção com IFfunção

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
jogador0
fonte