115 votes

Rafraîchir les données récupérées par une fonction personnalisée dans Google Sheet

J'ai écrit un script personnalisé pour Google Apps qui recevra un message d'erreur de la part de l'utilisateur. id et d'aller chercher des informations dans un service web (un prix).

J'utilise ce script dans une feuille de calcul, et cela fonctionne très bien. Mon problème est que ces prix changent, et que ma feuille de calcul n'est pas mise à jour.

Comment puis-je le forcer à réexécuter le script et à mettre à jour les cellules (sans passer manuellement par chaque cellule) ?

112voto

tbkn23 Points 3038

Ok, il semble que mon problème était que google se comporte d'une manière bizarre - il ne réexécute pas le script tant que les paramètres script sont similaires, il utilise les résultats mis en cache des exécutions précédentes. Par conséquent, il ne se reconnecte pas à l'API et ne récupère pas à nouveau le prix, il renvoie simplement le résultat du script précédent qui a été mis en cache.

Plus d'informations ici (ajoutez une étoile à ces questions, si vous êtes concerné) :

et La réponse de Henrique G. Abreu

Ma solution était d'ajouter un autre paramètre à mon script, que je n'utilise même pas. Maintenant, lorsque vous appelez la fonction avec un paramètre différent des appels précédents, il faudra réexécuter le script car le résultat pour ces paramètres ne sera pas dans le cache.

Ainsi, lorsque j'appelle la fonction, je passe "$A$1" comme paramètre supplémentaire. J'ai également créé un élément de menu appelé refresh, et lorsque je l'exécute, il met la date et l'heure actuelles dans A1, donc tous les appels au script avec $A$1 comme deuxième paramètre devront être recalculés. Voici un peu de code de mon script :

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Refresh",
    functionName : "refreshLastUpdate"
  }];
  sheet.addMenu("Refresh", entries);
};

function refreshLastUpdate() {
  SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}

function getPrice(itemId, datetime) {
  var headers =
      {
        "method" : "get",
        "contentType" : "application/json",
        headers : {'Cache-Control' : 'max-age=0'}
      };

  var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
  var jsonObj = eval( '(' + jsonResponse + ')' );
  return jsonObj.Price;
  SpreadsheetApp.flush();
}   

Et lorsque je veux mettre le prix de l'article avec l'ID 5 dans une cellule, j'utilise la formule suivante :

=getPrice(5, $A$1)

Lorsque je veux rafraîchir les prix, je clique simplement sur l'élément de menu "Rafraîchir" -> "Refresh". N'oubliez pas qu'il faut recharger la feuille de calcul après avoir modifié l'élément onOpen() script.

39voto

Lexi Brush Points 571

Ce que j'ai fait est similaire à celui de tbkn23. Cette méthode ne nécessite aucune action de la part de l'utilisateur, si ce n'est d'effectuer un changement.

La fonction que je veux réévaluer possède un paramètre supplémentaire inutilisé, $A$1. L'appel de fonction est donc le suivant

=myFunction(firstParam, $A$1)

Mais dans le code, la signature de la fonction est

function myFunction(firstParam)

Au lieu d'avoir une fonction Refresh, j'ai utilisé la fonction onEdit(e) comme ceci

function onEdit(e)
{
   SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}

Cette fonction est déclenchée chaque fois qu'une cellule de la feuille de calcul est modifiée. Ainsi, si vous modifiez une cellule, un nombre aléatoire est placé dans A1, ce qui rafraîchit la liste des paramètres comme l'a suggéré tbkn23, entraînant la réévaluation de la fonction personnalisée.

8voto

Thaina Yu Points 1258

Il y a des paramètres où vous pouvez faire NOW() se mettent à jour automatiquement :

enter image description here

7voto

flu Points 3120

Si votre fonction personnalisée se trouve dans une colonne spécifique, il suffit d'ordonner votre feuille de calcul en fonction de cette colonne.

L'action de classement force un rafraîchissement des données, qui invoque votre fonction personnalisée pour toutes les lignes de cette colonne.

4voto

Max Makhrov Points 10182

Comme indiqué précédemment :

Les fonctions personnalisées ne sont pas mises à jour si leurs arguments ne changent pas.

La solution possible est de créer une case à cocher dans une seule cellule et d'utiliser cette cellule comme argument pour la fonction personnalisée :

  1. Créez une case à cocher : sélectionnez une cellule libre, par exemple [A1], allez dans [Insertion] > [Case à cocher].
  2. Faites de cette cellule un argument : =myFunction(A1)
  3. Cliquez sur la case à cocher pour rafraîchir la formule

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X