web-dev-qa-db-fra.com

Paramètres non déterministes à la fonction personnalisée

J'ai un problème avec Google Spreadsheets: je crée une fonction personnalisée à l'aide de l'éditeur de script et il s'exécute uniquement si les paramètres que je passe sont des valeurs connues (constantes).

Si les paramètres sont des fonctions non déterministes, j'obtiens le texte Thinking... et l'évaluation n'est jamais terminée.

Par fonctions non déterministes, j'entends des fonctions dont le résultat peut différer chaque fois qu'il est appelé (par exemple: Rand(), Now()).

Pour illustrer cela, j'ai deux exemples:

1. Fonction pour ajouter 1 à un nombre

Voici le code:

function plusOne(i) {
  return i + 1;
}

Comme prévu, si j'entre =plusOne(5) dans une cellule, j'obtiens le résultat 6.

Cependant, si j’entre =plusOne(Rand()) j’attends d’obtenir un résultat aléatoire compris entre 1 et 2 (car la documentation indique que Rand() "renvoie un nombre aléatoire compris entre 0 et 1 ")

La formule =plusOne(Rand()) ne termine jamais l'évaluation et la cellule reste dans l'état "Penser ..." .

2. Fonction pour obtenir le mois à partir d'une date

function gimmeMonth(date) {
  return date.getMonth() + 1;
}

Encore une fois, si j'appelle cela avec un paramètre constant, cela fonctionne bien. Par exemple, si j'entre 2012-08-31 dans la cellule A1, la formule =gimmeMonth(A1) renvoie le résultat attendu 8.

Cependant, =gimmeMonth(now()) n'est jamais évalué, bien que la fonction intégrée month() fonctionne correctement dans ce cas (=month(now()) renvoie le résultat attendu).

Pourquoi j'ai besoin de ça

Je dois pouvoir ajouter un paramètre non déterministe dans mes appels de fonction personnalisés afin de éviter le cache .

Quelqu'un d'autre a-t-il eu ce problème? Quelqu'un a réussi à le résoudre?

6
Cristian Lupascu

J'ai fait des recherches et cela semble être un vieux problème, même à partir d'anciennes versions de MS Excel.

Je pense que le meilleur moyen est de créer votre propre fonction de randomisation. De cette façon, la valeur aléatoire ne sera pas régénérée. Vous l'utilisez de la même manière qu'avant =plusOne(myRandom())

function plusOne(i) {
  return i + 1;
}

function myRandom() {
  # Some function
  return Math.random();
}

Vous pouvez également le raccourcir =myRandom()

function myRandom() {
  # Some function
  return Math.random() + 1;
}
5
Łukasz Baranowski