Гаразд, схоже, моєю проблемою було те, що Google поводиться дивно - він не запускає сценарій повторно, поки параметри сценарію схожі, він використовує кешовані результати попередніх запусків. Отже, він не підключається до API і не отримує ціну, він просто повертає попередній результат сценарію, який був кешований.
Докладніше див. Тут: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
і тут: Сценарій для узагальнення даних, які не оновлюються
Моїм рішенням було додати до мого сценарію ще один параметр, який я навіть не використовую. Тепер, коли ви викликаєте функцію з параметром, який відрізняється від попередніх викликів, їй доведеться перезапустити сценарій, оскільки результат для цих параметрів не буде в кеші.
Тому, коли я викликаю функцію, для додаткового параметра я передаю "$ A $ 1". Я також створив пункт меню, який називається оновлення, і коли я його запускаю, він поміщає поточну дату та час в A1, отже, всі виклики сценарію з $ A $ 1 як другим параметром доведеться перерахувати. Ось код з мого сценарію:
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();
}
І коли я хочу поставити ціну елемента з ідентифікатором 5 у клітинку, я використовую наступну формулу:
=getPrice(5, $A$1)
Коли я хочу оновити ціни, я просто натискаю пункт «Оновити» -> «Оновити». Пам'ятайте, що вам потрібно перезавантажити електронну таблицю після зміни onOpen()
сценарію.