Como salvar variáveis ​​temporárias na fórmula do Planilhas Google?


19

Estou tentando criar uma fórmula em uma planilha do Google que se parece com isso:

if (x < 0, x + 1, x)

Significa se xé menor que 0, return x + 1, else return x.

No entanto, em xsi é uma expressão, por exemplo A1 + B1. Então acabei com:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

Como posso salvar a expressão (A1 + B1)em uma variável temporária para xque eu possa fazer isso? :

x = (A1 + B1);
if (x < 0, x + 1, x);

A expressão atual na minha planilha é assim:

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

Estou tentando fazer com que pareça mais curto e mais gerenciável assim:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)

1
@pnuts, Hmm, as variáveis ​​são parte integrante das fórmulas. Hackear células como variáveis ​​temporárias parece uma solução suja, porque as células destinam-se ao armazenamento de dados de negócios , não a ram.
Pacerier

1
@ nozes, não importa onde é armazenado, desde que não seja armazenado nas células. As células são destinadas ao armazenamento de dados corporativos .
Pacerier 20/12/14

1
@pnuts, Uma solução de script seria uma possível melhor alternativa possível. Contanto que os dados não apareçam em uma célula, é uma solução viável.
precisa saber é o seguinte

Respostas:


6

Costumo usar células como variáveis ​​para cálculos usados ​​com freqüência, e na verdade os nomeio como "intervalos nomeados". Isso facilita a reflexão sobre a fórmula que você está tentando desenvolver. Você pode ocultar essas células, se não quiser que elas sejam vistas.


Levará isso como solução selecionada até que uma melhor apareça.
Pacerier 12/11/2015

4

Resposta curta

No momento, o Planilhas Google não tem um recurso para atribuir um nome a uma variável definida por uma fórmula, em vez de uma referência de célula ou intervalo. Para usar uma fórmula com esses tipos de variáveis, a alternativa é usar funções personalizadas.

Funções personalizadas no Planilhas Google

As funções personalizadas são definidas nos projetos vinculados aos scripts do Google Apps ou nos complementos do Planilhas Google. Eles só poderiam ser usados ​​para retornar valores, não para automatizar tarefas como enviar um email.

Uma função customizada é como uma função JavaScript e pode usar o JSDOC para adicionar recursos de funções integradas, como preenchimento automático e exibir o auxiliar de fórmula pop-up. Também uma mensagem de erro personalizada pode ser incluída.

No caso apresentado na pergunta, a estrutura desejada da fórmula a ser mostrada em uma célula deve ter a seguinte estrutura

if(x < 0, 1 + x, x)

Onde xpoderia ser uma função personalizada.

A seguir, é apresentado um exemplo simples de uma função customizada que usa JSDOC .

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

A fórmula que utiliza a função personalizada acima com a estrutura especificada na pergunta terá a seguinte aparência:

=if(z(10) < 0, 1 + z(10), z(10))

row() pode ser usado em vez de uma constante para ter como entrada a linha em que a fórmula é colocada.

Para "emular" a fórmula explícita apresentada na pergunta, as fórmulas internas devem ser substituídas pelas funções JavasScript / Script do Google Apps.

Referências


Seria possível definir funções personalizadas usando as funções do Google Sheet (em vez de JS)? Não encontrei nada nessa direção, então duvido.
anderstood

@ compreender: Neste momento, não é possível. Veja stackoverflow.com/questions/3686061/…
Rubén

3

Estou fazendo algumas tentativas para isso (concordo que seria um recurso muito útil, especialmente para fórmulas longas. Aqui está o que escrevi até agora:

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

Teoricamente, isso seria útil para simplificar uma fórmula celular complexa, como:

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

nisso:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

Adicional D_VAR#'se VAR#'spode ser gravado no script para permitir várias declarações e chamadas de variáveis, conforme necessário.

No entanto, parece que D_VAR0não armazena corretamente a variável agrupada na matriz de variáveis ​​[].

Se eu inserir manualmente um elemento na matriz, o VAR0 poderá acessá-lo e devolvê-lo à célula ativa. Por exemplo:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

Isso me deixa com duas perguntas. Se o seguinte for possível, acho que é possível declarar e chamar variáveis ​​temporárias por meio de uma função personalizada:

  1. Se funções personalizadas puderem acessar elementos da matriz, elas também poderão armazenar elementos em uma matriz? Se sim, como?

  2. Se funções personalizadas puderem armazenar elementos em uma matriz, elas serão acessíveis apenas na mesma fórmula contígua na mesma célula? Ou é possível acessar a mesma variável armazenada em uma célula diferente? Exemplo:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.