Eu quero criar uma função que leva em um intervalo ... algo como:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Uma célula faria referência a ela usando:
=myFunction(A1:A4)
O problema é que, quando tento fazer isso, parece que o parâmetro está apenas passando os valores para a função. Portanto, não posso usar nenhum dos métodos Range , como getColumn()
. Quando tento fazer isso, ele dá o seguinte erro:
error: TypeError: Não foi possível encontrar a função getColumn no objeto 1,2,3.
Como posso enviar um intervalo real em vez de apenas os valores para uma das minhas funções personalizadas?
range
é tratado como o array 2D do javascript. Você pode obter o número de linhas comrange.length
e o número de colunas comrange[0].length
. Se você deseja obter o valor da linhar
e coluna dec
uso:range[r][c]
.fonte
=myFunction(C1:F1)
então dentro da funçãorange[0][0]
retornará o valor deC1
,range[0][1]
retornará o valor deD1
,range[0][2]
retornará o valor deE1
, etc. Isso está claro?=weightedAverage(B3:D3,$B$2:$D$2)
, gostaria de tornar a função mais à prova de erro por não precisar enviar o segundo argumento (ou seja, eu quero chamá-lo como=weightedAverage(B3:D3)
) e, em seguida, fazer com que o código saiba automaticamente que o intervalo começa em B e termina em D, para obter os valores correspondentes da 2ª linha. Nota: o valor "2" pode ser codificado, mas "B" não deve ser codificado.B
proveito de um dadorange
. Sugiro que você siga o guia de primeiros passos ( goo.gl/hm0xT ), se ainda não o fez, para ter uma idéia de como você pode brincar com intervalos e células.Ao passar
Range
para uma função de planilha do Google, a estrutura é executadaparamRange.getValues()
implicitamente e sua função recebe os valores no intervalo como uma matriz bidimensional de cadeias, números ou objetos (comoDate
). ORange
objeto não é passado para sua função de planilha personalizada.A
TYPEOF()
função abaixo mostra quais tipos de dados você recebe como parâmetro. A fórmula=TYPEOF(A1:A4)
chamará o script assim:
fonte
Como alternativa, inspirada no comentário do @Lipis, você pode chamar sua função com as coordenadas de linha / coluna como parâmetros adicionais:
Nesse formulário, a fórmula pode ser facilmente copiada (ou arrastada) para outras células e as referências de célula / intervalo serão ajustadas automaticamente.
Sua função de script precisaria ser atualizada da seguinte maneira:
Note que a
getRange
função recebestartRow
,startColumn
e, em seguida, o número de linhas e número de colunas - não terminar linha e final da coluna. Assim, a aritmética.fonte
Isso pode ser feito . Pode-se obter uma referência ao intervalo passado analisando a fórmula na célula ativa, que é a célula que contém a fórmula. Isso pressupõe que a função personalizada seja usada por si só e não como parte de uma expressão mais complexa: por exemplo
=myfunction(A1:C3)
, não=sqrt(4+myfunction(A1:C3))
.Esta função retorna o primeiro índice da coluna do intervalo passado.
fonte
Estendi a excelente idéia na resposta do usuário79865 , para fazê-lo funcionar em mais casos e com vários argumentos sendo passados para a função personalizada.
Para usá-lo, copie o código abaixo e, em seguida, na sua chamada de função personalizada
GetParamRanges()
, passando o nome da sua função:Aqui está um exemplo para retornar a cor de uma célula:
Aqui está o código e mais algumas explicações:
fonte
Distingo duas funções personalizadas diferentes na planilha do Google, via Script do Google Apps:
A primeira função é capaz de fazer quase qualquer coisa. Além de chamar o serviço de planilha, ele também pode acessar o GmailApp ou qualquer serviço disponibilizado pelo Google. As chamadas à API desacelerarão o processo. Um intervalo pode ser passado ou recuperado através da função para acessar todo o método disponível.
A segunda função é limitada apenas à "Planilha". Aqui é possível usar o JavaScript para refazer os dados. Essas funções são normalmente muito rápidas. Um intervalo passado não passa de uma matriz 2D que contém valores.
Na sua pergunta, você começa chamando o
.getColumn()
método. Isso indica claramente que você precisa de uma função personalizada do tipo 1, conforme descrito acima.Veja a resposta a seguir sobre como definir a planilha e a planilha, para criar uma função personalizada.
fonte
Eu estava trabalhando nisso há alguns meses e criei um kludge muito simples: crie uma nova planilha com o nome de cada célula como seu conteúdo: a célula A1 pode se parecer com:
Nomeie a planilha "Ref". Então, quando você precisar de uma referência a uma célula como uma sequência, em vez do conteúdo, use:
Obviamente, você precisará verificar se a função recebeu uma string (uma célula) ou uma matriz 1D ou 2D. Se você obtiver uma matriz, ela terá todos os endereços das células como cadeias, mas a partir da primeira célula e a largura e altura, você poderá descobrir o que precisa.
fonte
Estive trabalhando nisso a manhã toda e vendo evidências do que discutem as não respostas acima. Sensuous e eu quero o endereço da célula passada, não o valor. E a resposta é muito fácil. Isso não pode ser feito.
Encontrei algumas soluções alternativas que dependem de descobrir qual célula contém a fórmula. É difícil dizer se isso teria ajudado o Senseful acima. Então o que eu estava fazendo?
A coluna H é de Sophia (Vitórias - PrevWins) / (Perdas - PrevLosses)
(7 - 4) / (4-2) = 1,5
Mas não sabemos em que linha Sophia apareceu anteriormente.
Tudo isso pode ser feito usando o VLOOKUP se você codificar A como a coluna de nome. Após o VLOOKUP, eu estava obtendo alguns #NA (nome não encontrado) e # DIV0 (denominador zero) e o envolvi com = IF (IF (...)) para mostrar um texto mais palatável nessas condições. Agora eu tinha uma expressão monstruosamente grande que era pesada e insustentável. Então, eu queria expansão de macro (não existe) ou funções personalizadas.
Mas quando eu criei um auxiliar SubtractPrevValue (cell), ele estava recebendo "7" em vez de B5. Não há uma maneira interna de obter objetos de célula ou intervalo dos argumentos passados.
Se eu fizer o usuário digitar manualmente o nome da célula entre aspas duplas, poderá fazê-lo ... SubtractPrevValue ("B5"). Mas isso realmente isquiotibiais copiar / colar e características relativas da célula.
Mas então eu encontrei uma solução alternativa.
SpreadsheetApp.getActiveRange () É A CÉLULA que contém a fórmula. Isso é tudo que eu realmente precisava saber. O número da linha. A função a seguir pega um número de coluna NUMERIC e subtrai a ocorrência anterior nessa coluna.
Mas então eu descobri que isso é realmente muito lento. Atrasos de um e dois segundos enquanto exibe "Pensando ..." Então, estou de volta à fórmula da planilha maciçamente ilegível e impossível de manter.
fonte
Em vez de fornecer o objeto "Intervalo", os desenvolvedores do Google transmitem praticamente um tipo de dados aleatório. Então, desenvolvi a macro a seguir para imprimir o valor da entrada.
fonte
Há minha compilação de respostas anteriores
Ele pega a fórmula atual e verifica se é um intervalo.
=GFR(A1:A5;1;C1:C2;D1&D2)
retornaPara a composição completa, o TC pode chamar algo assim
fonte
Crie a função e passe o intervalo como argumento:
Uso na planilha:
Ele mostrará o valor como
sum(A1:A10)
.fonte