Respostas:
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.
Resposta semelhante à resposta de caligari , mas podemos organizá-la apenas especificando o intervalo completo da coluna:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
gama ed, semelhante à resposta da @ Geta .
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. COUNTA
só é útil quando combinado com INDEX
para obter o último valor se não houver um único espaço em branco entre seus valores.
COUNTA
. COUNT
só conta valores numéricos: ele retornará 0 quando fornecido, por exemplo, células de texto.
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)))))
ROW
retorna 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, MAX
nos 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).
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.
COUNTA
nesse 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.
:G
denota o último elemento? Isso está documentado?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
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 COUNT
para 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 COLUMNS
ouROWS
para um determinado intervalo.
No entanto, se COLUMNS
for 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 COUNTA
o 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) )
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))
COUNTA
combinado com INDEX
não retornará o último valor da coluna.
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.
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?
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.
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)) ) ) )
=INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
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)
É 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.
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)
Eu encontrei outra maneira que pode te ajudar
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- retornará a última linha
Mais informações da anab aqui: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
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 LOOKUP
faz 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 ROW
da linha não em branco e alimentá-loINDEX
Em uma matriz de interrupção em branco zero, Usar INDIRECT
RC
notaçã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.
Tools -> Scripts -> Script editor...