Actualizar datos recuperados por una función personalizada en la Hoja de Google

He escrito un Script de Google Apps personalizado que recibirá una id y obtendrá información de un servicio web (un precio).

Utilizo este script en una hoja de cálculo, y funciona muy bien. Mi problema es que estos precios cambian y mi hoja de cálculo no se actualiza.

¿Cómo puedo obligarlo a volver a ejecutar el script y actualizar las celdas (sin examinar manualmente cada celda)?

De acuerdo, parece que mi problema fue que Google se comporta de una manera extraña: no vuelve a ejecutar el script, siempre y cuando los parámetros del script sean similares, utilice los resultados almacenados en caché de las ejecuciones anteriores. Por lo tanto, no se vuelve a conectar a la API y no vuelve a buscar el precio, simplemente devuelve el resultado de la secuencia de comandos anterior que se almacenó en caché.

Consulte más información aquí: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

y aquí: Script para resumir datos que no se actualizan

Mi solución fue agregar otro parámetro a mi script, que ni siquiera uso. Ahora, cuando llama a la función con un parámetro que es diferente a las llamadas anteriores, tendrá que volver a ejecutar la secuencia de comandos porque el resultado para estos parámetros no estará en la memoria 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 refresh, y cuando lo ejecuto, pone la fecha y la hora actual en A1, por lo tanto, todas las llamadas al script con $ A $ 1 como segundo parámetro tendrán que volver a calcularse. 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 la opción de menú “Refrescar” -> “Actualizar”. Recuerde que debe volver a cargar la hoja de cálculo después de cambiar el onOpen() .

Sé que esta es una pregunta un poco vieja. Pero este método no requiere ninguna acción del usuario excepto hacer un cambio.

Lo que hice fue similar a tbkn23.

La función que quiero volver a evaluar tiene un parámetro extra no utilizado, $ A $ 1. Entonces la llamada a la función es

 =myFunction(firstParam, $A$1) 

Pero en el código, la firma de la función es

 function myFunction(firstParam) 

En lugar de tener una función Refresh, he usado la función onEdit (e) como esta

 function onEdit(e) { SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random()); } 

Esta función se activa cada vez que se edita cualquier celda en la hoja de cálculo. Entonces, ahora edita una celda, se coloca un número aleatorio en A1, esto actualiza la lista de parámetros como sugirió tbkn23, haciendo que la función personalizada sea reevaluada.

Esto es muy tarde y no sé si sería útil, pero en realidad hay una configuración aquí que puede hacer que NOW() actualice automáticamente

enter image description here

Si su función personalizada está dentro de una columna específica, simplemente ordene su hoja de cálculo por esa columna.

El orden obliga a una actualización de los datos que invoca su función personalizada para todas las filas de esa columna a la vez.

Este puede ser un hilo súper antiguo, pero puede ser útil para alguien que intenta hacer esto, como lo estaba haciendo ahora.

Trabajando fuera del guión de Lexi tal como está, no parecía funcionar más con las Hojas actuales, pero si agrego la variable ficticia a mi función como parámetro (no es necesario usarla dentro de la función), de hecho fuerce las hojas de google para refrescar la página otra vez.

Entonces, una statement como: function myFunction (firstParam, dummy) y luego llamarla sería como se ha sugerido. Eso funcionó para mí.

Además, si es una molestia para una variable aleatoria aparecer en todas las hojas que edita, una solución fácil de limitar a una hoja es la siguiente:

 function onEdit(e) { e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random()); } 

Si ha escrito una función personalizada y la ha utilizado en su hoja de cálculo como fórmula, cada vez que abra la hoja de cálculo o cualquier celda de referencia se modifique, la fórmula se volverá a calcular.

Si desea seguir mirando la hoja de cálculo y desea que sus valores cambien, considere agregar un activador temporizado que actualizará las celdas. Lea más sobre los desencadenantes aquí