Comment enregistrer des variables temporaires dans la formule Google Sheets?

19

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 xest plus petit que 0, return x + 1, else return x.

Cependant, xlui-même est une expression, par exemple A1 + B1. Je me suis donc retrouvé avec:

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

Comment puis-je enregistrer l'expression (A1 + B1)dans une variable temporaire xpour pouvoir 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 faire paraître 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
)
Pacerier
la source
1
@pnuts, Hmm, les variables font partie intégrante des formules. Le piratage de cellules en tant que variables temporaires semble une solution sale, car les cellules sont destinées à stocker des données commerciales , pas à ramer.
Pacerier
1
@pnuts, peu importe où il est stocké tant qu'il n'est pas stocké dans les cellules. Les cellules sont destinées à stocker des données d' entreprise .
Pacerier
1
@pnuts, une solution de script serait la prochaine meilleure alternative possible. Tant que les données n'apparaissent pas dans une cellule, c'est une solution viable.
Pacerier

Réponses:

6

Je finis souvent par utiliser des cellules comme variables pour des calculs souvent utilisés, et en fait je les nomme en utilisant des "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 qu'elles soient vues.

Kostas Georgokitsos
la source
Prendra ceci comme solution choisie jusqu'à ce qu'une meilleure arrive.
Pacerier
4

Réponse courte

À l'heure actuelle, Google Sheets n'a pas de fonctionnalité pour 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 les modules complémentaires Google Sheets. Ils ne peuvent être utilisés que pour renvoyer des valeurs, et non pour automatiser des tâches telles que l'envoi d'un e-mail.

Une fonction personnalisée est comme une fonction JavaScript et pourrait 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é peut également être inclus.

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

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

xpourrait être une fonction personnalisée.

Voici un exemple simple d'une fonction personnalisée qui utilise 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 en 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 des fonctions de script JavasScript / Google Apps.

Les références

Rubén
la source
Serait-il possible de définir des fonctions personnalisées en utilisant les fonctions de Google Sheet (au lieu de JS)? Je n'ai rien trouvé dans ce sens donc j'en doute.
anderstood
@anderstood: Pour le moment, ce n'est pas possible. Voir stackoverflow.com/questions/3686061/…
Rubén
3

Je fais quelques tentatives (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 cellulaire complexe telle que:

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

en cela:

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

Supplémentaire D_VAR#'set VAR#'spourrait être écrit dans le script pour permettre plusieurs déclarations et appels de variables selon les besoins.

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

Si j'entre manuellement un élément dans le tableau, VAR0 peut y accéder et 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 éléments suivants 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 aux éléments du tableau, peuvent-elles également stocker des é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-elles 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.

Andrew
la source