J'ai écrit un script Google Apps personnalisé qui recevra id
et récupérera des informations d'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 sur chaque cellule)?
Réponses:
Ok, il semble que mon problème était que Google se comporte d'une manière étrange - il ne réexécute pas le script tant que les paramètres du 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 le prix, il renvoie simplement le résultat du script précédent qui a été mis en cache.
Pour plus d'informations, cliquez ici: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
et ici: Script pour résumer les données non actualisées
Ma solution était d'ajouter un autre paramètre à mon script, que je n'utilise même pas. Désormais, lorsque vous appelez la fonction avec un paramètre différent des appels précédents, elle devra réexécuter le script car le résultat de 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ément de menu appelé refresh, et lorsque je l'exécute, il met la date et l'heure actuelles dans A1, par conséquent tous les appels au script avec $ A $ 1 comme deuxième paramètre devront recalculer. Voici du 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 l'ID 5 dans une cellule, j'utilise la formule suivante:
=getPrice(5, $A$1)
Lorsque je souhaite actualiser les prix, je clique simplement sur l'élément de menu "Actualiser" -> "Actualiser". N'oubliez pas que vous devez recharger la feuille de calcul après avoir modifié le
onOpen()
script.la source
Je sais que c'est un peu une vieille question. Mais cette méthode ne nécessite aucune action de l'utilisateur, sauf une modification.
Ce que j'ai fait était similaire à tbkn23.
La fonction que je veux réévaluer a un paramètre supplémentaire inutilisé, $ A $ 1. Donc, l'appel de fonction est
=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. Alors maintenant que vous éditez une cellule, un nombre aléatoire est placé dans A1, cela actualise la liste des paramètres comme suggéré par tbkn23, provoquant la réévaluation de la fonction personnalisée.
la source
C'est très tard et je ne sais pas que ce serait utile mais en fait il y a des paramètres ici, vous pouvez faire la
NOW()
mise à jour automatiquementla source
NOW()
est une fonction intégrée, pas une fonction personnalisée.Si votre fonction personnalisée se trouve dans une colonne spécifique, commandez simplement votre feuille de calcul par cette colonne.
L'action de classement force une actualisation des données, qui appelle votre fonction personnalisée pour toutes les lignes de cette colonne à la fois.
la source
Cela peut être un fil de discussion très ancien mais peut être utile pour quelqu'un qui essaie de le faire, comme je l'étais tout à l'heure.
Fonctionnant à partir du script de Lexi tel quel, cela 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 dans la fonction), cela fonctionnera en effet forcer les feuilles de google à actualiser à nouveau la page.
Donc, une déclaration comme: function myFunction (firstParam, dummy) et l'appeler ensuite serait comme cela a été suggéré. Cela a fonctionné pour moi.
De plus, s'il est gênant pour une variable aléatoire d'apparaître sur toutes vos feuilles que vous éditez, un remède facile pour limiter à une feuille est le suivant:
function onEdit(e) { e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random()); }
la source
Logique de script:
Fragment:
/*@customfunction*/ function sheetNames(e) { return SpreadsheetApp.getActive() .getSheets() .map(function(sheet) { return sheet.getName(); }); } /*Create a installable trigger to listen to grid changes on the sheet*/ function onChange(e) { if (!/GRID/.test(e.changeType)) return; //Listen only to grid change SpreadsheetApp.getActive() .createTextFinder('=SHEETNAMES\\([^)]*\\)') .matchFormulaText(true) .matchCase(false) .useRegularExpression(true) .replaceAllWith( '=SHEETNAMES(' + (Math.floor(Math.random() * 500) + 1) + ')' ); }
Lire:
la source
Comme mentionné plus tôt:
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:
=myFunction(A1)
la source
Si vous avez écrit une fonction personnalisée et que vous l'avez utilisée dans votre feuille de calcul en tant que formule, chaque fois que vous ouvrez la feuille de calcul ou qu'une cellule de référence est modifiée, la formule est recalculée.
Si vous souhaitez simplement continuer à regarder la feuille de calcul et que ses valeurs changent, envisagez d'ajouter un déclencheur chronométré qui mettra à jour les cellules. En savoir plus sur les déclencheurs ici
la source