Ok, parece que meu problema é que o Google se comporta de uma maneira estranha - ele não executa novamente o script, desde que os parâmetros do script sejam semelhantes, ele usa os resultados armazenados em cache das execuções anteriores. Portanto, ele não se reconecta à API e não busca o preço novamente, simplesmente retorna o resultado do script anterior que foi armazenado em cache.
Veja mais informações aqui: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
e aqui: Script para resumir os dados não atualizados
Minha solução foi adicionar outro parâmetro ao meu script, que eu nem mesmo uso. Agora, ao chamar a função com um parâmetro diferente das chamadas anteriores, ela terá que executar novamente o script porque o resultado para esses parâmetros não estará no cache.
Portanto, sempre que chamo a função, para o parâmetro extra, passo "$ A $ 1". Também criei um item de menu chamado refresh e, quando o executo, ele coloca a data e a hora atuais em A1, portanto, todas as chamadas para o script com $ A $ 1 como segundo parâmetro terão que ser recalculadas. Aqui está um código do meu 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();
}
E quando quero colocar o preço do item com ID 5 em uma célula, uso a seguinte fórmula:
=getPrice(5, $A$1)
Quando quero atualizar os preços, simplesmente clico no item de menu "Atualizar" -> "Atualizar". Lembre-se de que você precisa recarregar a planilha após alterar o onOpen()
script.