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.