Ok, parece que mi problema fue que Google se comporta de una manera extraña: no vuelve a ejecutar el script siempre que los parámetros del script sean similares, usa resultados almacenados en caché de las ejecuciones anteriores. Por lo tanto, no se vuelve a conectar a la API y no recupera el precio, simplemente devuelve el resultado del script anterior que se almacenó en caché.
Vea más información aquí: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888
y aquí: Script para resumir los datos que no se actualizan
Mi solución fue agregar otro parámetro a mi script, que ni siquiera uso. Ahora, cuando llame a la función con un parámetro que sea diferente a las llamadas anteriores, tendrá que volver a ejecutar el script porque el resultado de estos parámetros no estará en la caché.
Entonces, cada vez que llamo a la función, para el parámetro adicional paso "$ A $ 1". También creé un elemento de menú llamado actualizar, y cuando lo ejecuto, pone la fecha y hora actual en A1, por lo tanto, todas las llamadas al script con $ A $ 1 como segundo parámetro tendrán que recalcularse. Aquí hay un código de mi 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();
}
Y cuando quiero poner el precio del artículo con ID 5 en una celda, uso la siguiente fórmula:
=getPrice(5, $A$1)
Cuando quiero actualizar los precios, simplemente hago clic en el elemento de menú "Actualizar" -> "Actualizar". Recuerde que debe volver a cargar la hoja de cálculo después de cambiar la onOpen()
secuencia de comandos.