¿Cómo guardar variables temporales en la fórmula de Hojas de cálculo de Google?

19

Estoy tratando de crear una fórmula en una hoja de cálculo de Google que se vea así:

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

Significa si xes menor que 0, return x + 1, else return x.

Sin embargo, xsí mismo es una expresión, por ejemplo A1 + B1. Entonces terminé con:

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

¿Cómo puedo guardar la expresión (A1 + B1)en una variable temporal para xpoder hacer esto? :

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

La expresión actual en mi hoja de cálculo se ve así:

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

Estoy tratando de hacer que se vea más corto y más manejable de esta manera:

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
)
Pacerier
fuente
1
@pnuts, Hmm, las variables son parte integral de las fórmulas. Hackear celdas como variables temporales se siente como una solución sucia porque las celdas están destinadas a almacenar datos comerciales , no ram.
Pacerier
1
@pnuts, no importa dónde esté almacenado siempre que no esté almacenado en las celdas. Las celdas están destinadas a almacenar datos comerciales .
Pacerier
1
@pnuts, una solución de script sería una posible alternativa mejor. Mientras los datos no aparezcan en una celda, es una solución viable.
Pacerier

Respuestas:

6

A menudo termino usando celdas como variables para cálculos que se usan con frecuencia, y de hecho los nombro usando "rangos con nombre". Hace que sea más fácil pensar en la fórmula que está tratando de desarrollar. Puede ocultar esas celdas, si no desea que se vean.

Kostas Georgokitsos
fuente
Tomará esto como solución seleccionada hasta que aparezca una mejor.
Pacerier
4

Respuesta corta

En este momento, Google Sheets no tiene una función para asignar un nombre a una variable definida por una fórmula en lugar de una referencia de celda o rango. Para usar una fórmula con este tipo de variables, la alternativa es usar funciones personalizadas.

Funciones personalizadas en Hojas de cálculo de Google

Las funciones personalizadas se definen en proyectos vinculados de Google Apps Scripts o complementos de Google Sheets. Solo se pueden usar para devolver valores, no para automatizar tareas como enviar un correo electrónico.

Una función personalizada es como una función de JavaScript y podría usar JSDOC para agregar funciones incorporadas como autocompletar y mostrar el asistente de fórmula emergente. También se podría incluir un mensaje de error personalizado.

En el caso presentado en la pregunta, la estructura deseada de la fórmula que se mostrará en una celda debe tener la siguiente estructura

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

donde xpodría ser una función personalizada.

El siguiente es un ejemplo simple de una función personalizada 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();
}

La fórmula que usa la función personalizada anterior con la estructura especificada en la pregunta se verá de la siguiente manera

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

row() podría usarse en lugar de una constante para tener como entrada la fila donde se coloca la fórmula.

Con el fin de "emular" la fórmula explícita presentada en la pregunta, las fórmulas integradas deben reemplazarse por las funciones JavasScript / Google Apps Script.

Referencias

Rubén
fuente
¿Sería posible definir funciones personalizadas utilizando las funciones de Google Sheet (en lugar de las JS)? No encontré nada en esta dirección, así que lo dudo.
entendido el
@anderstood: en este momento no es posible. Ver stackoverflow.com/questions/3686061/…
Rubén
3

Estoy intentando hacer esto (estoy de acuerdo en que sería una característica muy útil, especialmente para fórmulas largas. Esto es lo que he escrito hasta ahora:

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

Teóricamente, esto sería útil para simplificar una fórmula celular compleja como:

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

dentro de esto:

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

Adicional D_VAR#'sy VAR#'spodría escribirse en el script para permitir múltiples declaraciones de variables y llamadas según sea necesario.

Sin embargo, parece que D_VAR0no almacena correctamente la variable envuelta en la matriz de variables [].

Si ingreso manualmente un elemento en la matriz, VAR0 puede acceder a él y devolverlo a la celda activa. Por ejemplo:

var variables = ["test"];

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

Esto me deja con dos preguntas. Si es posible lo siguiente, creo que es posible declarar y llamar variables temporales a través de una función personalizada:

  1. Si las funciones personalizadas pueden acceder a los elementos de la matriz, ¿también pueden almacenar elementos en una matriz? ¿Si es así, cómo?

  2. Si las funciones personalizadas pueden almacenar elementos en una matriz, ¿solo son accesibles dentro de la misma fórmula contigua en la misma celda? ¿O es posible acceder a esa misma variable almacenada en una celda diferente? Ejemplo:

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

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

Andrés
fuente