Хорошо, похоже, моя проблема заключалась в том, что 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();
}
И когда я хочу указать цену товара с ID 5 в ячейке, я использую следующую формулу:
=getPrice(5, $A$1)
Когда я хочу обновить цены, я просто нажимаю пункт меню «Обновить» -> «Обновить». Помните, что вам необходимо перезагрузить электронную таблицу после изменения onOpen()
сценария.