web-dev-qa-db-fra.com

Comment enregistrer des variables temporaires dans la formule Google Sheets?

J'essaie de créer une formule dans une feuille de calcul Google qui ressemble à ceci:

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

Cela signifie que si x est inférieur à 0, retourne x + 1, sinon renvoie x.

Cependant, x lui-même est une expression, par ex. A1 + B1. Alors j'ai fini avec:

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

Comment enregistrer l'expression (A1 + B1) dans une variable temporaire x telle que je puisse le faire? :

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

L'expression actuelle dans ma feuille de calcul ressemble à ceci:

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

J'essaie de le rendre plus court et plus facile à gérer comme ceci:

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

Je finis souvent par utiliser des cellules en tant que variables pour des calculs souvent utilisés et je les nomme en utilisant "plages nommées". Cela facilite la réflexion sur la formule que vous essayez de développer. Vous pouvez masquer ces cellules si vous ne voulez pas les voir.

6

Réponse courte

À l'heure actuelle, Google Sheets ne dispose pas d'une fonctionnalité permettant d'attribuer un nom à une variable définie par une formule au lieu d'une référence de cellule ou de plage. Pour utiliser une formule avec ces types de variables, l'alternative consiste à utiliser des fonctions personnalisées.

Fonctions personnalisées dans Google Sheets

Les fonctions personnalisées sont définies dans les projets liés aux scripts Google Apps ou dans les modules complémentaires de Google Sheets. Ils peuvent uniquement être utilisés pour renvoyer des valeurs, pas pour automatiser des tâches telles que l'envoi d'un courrier électronique.

Une fonction personnalisée est semblable à une fonction JavaScript et peut utiliser JSDOC pour ajouter des fonctions intégrées, telles que la saisie semi-automatique, et pour afficher l’aide de formule contextuelle. Un message d'erreur personnalisé pourrait également être inclus.

Dans le cas présenté dans la question, la structure souhaitée de la formule à afficher dans une cellule devrait avoir la structure suivante

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

x pourrait être une fonction personnalisée.

Voici un exemple simple de fonction personnalisée utilisant 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 formule utilisant la fonction personnalisée ci-dessus avec la structure spécifiée dans la question se présentera de la manière suivante

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

row() pourrait être utilisé à la place d'une constante pour avoir comme entrée la ligne où la formule est placée.

Pour "émuler" la formule explicite présentée dans la question, les formules intégrées doivent être remplacées par les fonctions de script JavasScript/Google Apps.

Références

4
Rubén

Je fais quelques tentatives dans ce sens (je conviens que ce serait une fonctionnalité très utile, en particulier pour les formules longues. Voici ce que j'ai écrit jusqu'à présent:

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

Théoriquement, cela serait utile pour simplifier une formule de cellule complexe telle que:

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

dans ceci:

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

Des fichiers D_VAR#'s et VAR#'s supplémentaires peuvent être écrits dans le script pour permettre plusieurs déclarations et appels de variables, selon les besoins.

Cependant, il semble que D_VAR0 ne stocke pas correctement la variable enveloppée dans le tableau de variables [].

Si je saisis manuellement un élément dans le tableau, VAR0 est en mesure d'y accéder et de le retourner dans la cellule active. Par exemple:

var variables = ["test"];

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

Cela me laisse avec deux questions. Si les possibilités suivantes sont possibles, je pense qu’il est possible de déclarer et d’appeler des variables temporaires via une fonction personnalisée:

  1. Si les fonctions personnalisées peuvent accéder éléments de tableau, peuvent-elles également stocker éléments dans un tableau? Si c'est le cas, comment?

  2. Si les fonctions personnalisées peuvent stocker des éléments dans un tableau, sont-ils uniquement accessibles dans la même formule contiguë dans la même cellule? Ou est-il possible d'accéder à cette même variable stockée dans une cellule différente? Exemple:

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

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

3
Andrew