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

j'ai écrit un Script Googleapps personnalisé qui recevra un id et récupérera des informations d'un service web (un prix).

j'utilise ce script dans un tableur, et ça marche très bien. Mon problème est que ces prix changent, et mon tableur n'est pas mis à jour.

Comment puis-je le forcer à relancer le script et à mettre à jour les cellules (sans passer manuellement au-dessus de chaque cellule)?

65
demandé sur Kos 2013-06-27 15:01:43

6 réponses

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

voir plus d'informations ici: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

et ici: Script pour résumer les données ne mettant pas à jour

ma solution a été 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 qui est différent des appels précédents, elle devra relire le script parce que le résultat pour ces paramètres ne sera pas dans le cache.

donc chaque fois que j'appelle la fonction, pour le paramètre supplémentaire je passe"$a$1". J'ai également créé un l'article de menu appelé refresh, et quand je l'exécute, il met la date et l'heure actuelles dans A1, donc tous les appels au script avec $A 1$comme second paramètre devront être recalculés. Voici un 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 quand je veux mettre le prix de l'article avec ID 5 dans une cellule, j'utilise la formule suivante:

=getPrice(5, $A)

quand je veux rafraîchir les prix, je clique simplement sur le menu" rafraîchir "- > "rafraîchir". N'oubliez pas que vous devez rechargez le tableur après avoir changé le script onOpen() .

64
répondu tbkn23 2017-05-23 11:54:44

je sais que c'est une vieille question. Mais cette méthode ne nécessite aucune action de l'utilisateur, à l'exception d'un changement.

ce que j'ai fait était similaire à tbkn23.

la fonction que je veux réévaluer a un paramètre non utilisé supplémentaire, $a$1. Donc l'appel de fonction est

=myFunction(firstParam, $A)

mais dans le code la fonction signature est

function myFunction(firstParam)

au lieu d'avoir une fonction de rafraîchissement j'ai utilisé le onEdit (e) fonction comme ceci

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

cette fonction est activée chaque fois qu'une cellule du tableur est éditée. Donc maintenant vous éditez une cellule, un nombre aléatoire est placé dans A1, ce qui rafraîchit la liste des paramètres comme tbkn23 suggéré, provoquant la fonction personnalisée pour être réévalué.

28
répondu Lexi Brush 2014-12-26 11:10:52

c'est très tard et je ne sais pas si ce serait utile mais en fait il ya des paramètres ici, vous pouvez faire NOW() mise à jour automatiquement

enter image description here

6
répondu Thaina 2016-06-15 07:50:23

si vous êtes fonction personnalisée est à l'intérieur d'une colonne spécifique il suffit de commander votre tableur par cette colonne.

l'ordre force un rafraîchissement des données qui invoque votre fonction personnalisée pour toutes les lignes de cette colonne à la fois.

3
répondu flu 2016-11-21 20:06:47

C'est peut-être un super vieux thread mais peut être utile pour quelqu'un qui essaie de le faire, que j'étais tout à l'heure.

travaillant hors du script de Lexi tel quel, il ne semblait plus fonctionner avec les feuilles actuelles, mais si j'ajoute la variable factice dans ma fonction en tant que paramètre (pas besoin de l'utiliser réellement à l'intérieur de la fonction), il va en effet forcer Google sheets à rafraîchir la page à nouveau.

ainsi, déclaration comme: fonction myFunction (firstParam, dummy) et alors l'appeler serait comme cela a été suggéré. Ce qui a fonctionné pour moi.

en outre, si c'est une nuisance pour une variable aléatoire d'apparaître sur toutes vos feuilles que vous éditez, un remède facile à limiter à une feuille est comme suit:

function onEdit(e)
{
  e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}
-1
répondu AvengingAB 2016-02-08 06:16:07

si vous avez écrit une fonction personnalisée et l'avez utilisée dans votre tableur comme une formule, puis chaque fois que vous ouvrez le tableur ou toute cellule de référence est modifiée, la formule est recalculée.

si vous voulez simplement continuer à regarder le tableur et que vous voulez que ses valeurs changent, alors envisagez d'ajouter un déclencheur chronométré qui mettra à jour les cellules. En savoir plus sur les déclencheurs ici

-2
répondu Srik 2013-06-27 11:31:54