Ok, wydaje mi się, że moim problemem było to, że Google zachowuje się dziwnie - nie uruchamia ponownie skryptu, o ile parametry skryptu są podobne, używa buforowanych wyników z poprzednich uruchomień. W związku z tym nie łączy się ponownie z interfejsem API i nie pobiera ponownie ceny, po prostu zwraca wynik poprzedniego skryptu, który został zapisany w pamięci podręcznej.
Zobacz więcej informacji tutaj: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
i tutaj: skrypt podsumowujący dane, które nie są aktualizowane
Moim rozwiązaniem było dodanie kolejnego parametru do mojego skryptu, którego nawet nie używam. Teraz, gdy wywołasz funkcję z parametrem innym niż poprzednie wywołania, będzie ona musiała ponownie uruchomić skrypt, ponieważ wynik dla tych parametrów nie będzie w pamięci podręcznej.
Więc ilekroć wywołuję tę funkcję, jako dodatkowy parametr przekazuję „$ A $ 1”. Utworzyłem również element menu o nazwie odświeżanie, a kiedy go uruchamiam, umieszcza bieżącą datę i godzinę w A1, stąd wszystkie wywołania skryptu z $ A $ 1 jako drugim parametrem będą musiały zostać przeliczone ponownie. Oto kod z mojego skryptu:
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();
}
A kiedy chcę umieścić w komórce cenę przedmiotu o identyfikatorze 5, używam następującego wzoru:
=getPrice(5, $A$1)
Kiedy chcę odświeżyć ceny, po prostu klikam opcję „Odśwież” -> „Odśwież”. Pamiętaj, że po zmianie onOpen()
skryptu musisz ponownie załadować arkusz kalkulacyjny .