Actualmente, quiero ejecutar el script de mi aplicación de Google en el momento exacto. Ya leí un poco sobre este problema y decido seguir la solución en esta publicación . ¿Es posible ejecutar el script de Google Sheets en tiempo exacto todos los días? .
Sin embargo, cada vez que el disparador de tiempo solo funciona una vez. Mostrará un error por segunda vez. Busqué en Google sobre este problema y la mayoría de ellos afirman que es un error de Google v8 ( https://issuetracker.google.com/issues/150756612 ).
Entonces, decido degradar mi código a ES5 ya que esa es la única solución de la publicación ( https://issuetracker.google.com/issues/150756612 ). Pero tengo un problema al cambiar el spread operator(...) a ES5
Aquí está mi código:
function runTrigger(hours,minutes) { var today_D=new Date(); var year=today_D.getFullYear(); var month=today_D.getMonth(); var day=today_D.getDate(); day=day+1; var pars=[year,month,day,hours,minutes]; var schedule_date=new Date(...pars); var hours_reamain=Math.abs(schedule_date - today_D)/36e5; ScriptApp.newTrigger("testFunction") .timeBased() .after(hours_reamain*60*60*1000) .create() } function deleteTrigger() { var triggers=ScriptApp.getProjectTriggers(); var ssId="1d5P4ohgSLtOzuInxq1IYQUsB4GybeYhth5Gj21RI3rA"; var ss=SpreadsheetApp.openById(ssId); for(var i=0 ; i< triggers.length ; i++) { ss.appendRow([new Date() ,JSON.stringify(triggers[i]), JSON.stringify(triggers[i].getHandlerFunction()) , JSON.stringify(triggers[i].getEventType()) , JSON.stringify(triggers[i].getTriggerSource())]) if(triggers[i].getHandlerFunction() === "testFunction") { ScriptApp.deleteTrigger(triggers[i]); } } } function setTrigger() { deleteTrigger(); runTrigger(1,35); } function testFunction() { //some code at here setTrigger(); } ¿Alguien puede enseñarme cómo puedo cambiar el ...(spread operator) a ES5
No creo que se pueda configurar un disparador para que se ejecute en un momento exacto. Mi sugerencia es configurar el disparador para que se ejecute una hora antes de la hora en que le gustaría que se dispare, luego, haga que su función ejecute un bucle para verificar la hora exacta, tal vez ejecutar cada minuto.
Lo que estoy haciendo hasta ahora es lanzar una función que configurará el disparador a la hora exacta en función de la hora actual. Me aseguro de que se elimine el disparador anterior y lo vuelvo a crear.
function actionAtExactHour() { var f = 'myFunction' ScriptApp.getProjectTriggers().filter(trigger => trigger.getHandlerFunction() == f).forEach(t => ScriptApp.deleteTrigger(t)) var d = new Date(); ScriptApp.newTrigger(f) .timeBased() .after((60 - d.getMinutes()) * 60 * 1000) .create() } function myFunction(){ SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(new Date()) }Sin embargo, no puedo poner un disparador en actionAtExactHour para, por ejemplo, disparar el disparador diariamente y hacer que myFunction se ejecute todos los días a la hora exacta... Google desactivará ese disparador. Para hacer esto, necesito ejecutar actionAtExactHour unos minutos antes de la hora exacta que quiero.
var schedule_date=new Date(year,month,day,hours,minutes);