En una aplicación el usuario necesita guardar los datos desde varias hojas de cálculo (cada una de un grupo de alumnos) en una hoja aparte para poder gestionar históricos.
La labor que tenemos es crear un activador para que se haga de forma automática.
Existen activadores que se lanzan en una fecha concreta, pero nosotros queremos que sea no una sola vez, sino una fecha concreta cada año.
Nos encontramos que en google script no existe dicha opción ya que lo máximo que podemos automatizar es por meses.
Además, nos interesa que el usuario no tenga que aprender a crear activadores sino que le facilitemos un par de desplegables (para día y mes concretos) desde la hoja de cálculo.
He aquí el código que lo permite
function crear_o_cambiar_activador() {
// Borramos todos los activadores
borrar_todos_activadores()
//creamos el activador dependiendo del día elegido
//(el mes se define dentro de la función - conseguir_datos-)
// Como solamente existen activadores cada mes,
//hay que crear la comparación entre mes actual y mes elegido
//dentro de la función a activar
// Hacemos un condicional y si no se cumple salimos de la función con return
var educakoa = SpreadsheetApp.getActiveSpreadsheet()
var dia = educakoa.getRangeByName('dia').getValue()
ScriptApp.newTrigger('conseguir_datos').timeBased().onMonthDay(dia).create()
}
La función auxiliar que necesitamos para borrar los anteriores activadores es esta:
function borrar_todos_activadores() {
var triggers = ScriptApp.getProjectTriggers()
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
Este trozo necesitamos incluirlo en la función a activar, al principio del código
var mes_actual = educakoa.getRangeByName('mes_actual').getValue()
var mes_elegido = educakoa.getRangeByName('mes_elegido').getValue()
if (mes_actual !=mes_elegido){return}
El problema se complica si tenemos otros activadores que no queremos borrar.
Una función intermedia es esta que solamente borra los activadores basados en el tiempo:
function borrar_activadores_de_tiempo()
{
var activadores=ScriptApp.getProjectTriggers()
for (cada in activadores){
if (activadores[cada].getEventType()=="CLOCK"){
ScriptApp.deleteTrigger(activadores[cada])
}
}
}
(en la función -crear_o_cambiar_activadores- sustituimos la fila - borrar_todos_activadores() - por - borrar_activadores_de_tiempo()-
Como última mejoría, podemos utilizar esta función para borrar (borra activadores de tiempo que llamen a una función concreto, en este caso -conseguir_datos -
function borrar_activadores_de_tiempo_de_una_funcion_concreta()
{
var activadores=ScriptApp.getProjectTriggers()
for (cada in activadores){
Logger.log(activadores[cada].getHandlerFunction())
if (activadores[cada].getEventType()=="CLOCK"){
if (activadores[cada].getHandlerFunction()=='conseguir_datos'){
ScriptApp.deleteTrigger(activadores[cada])
}}
}
}
(en la función -crear_o_cambiar_activadores- sustituimos la fila - borrar_todos_activadores() - por - borrar_activadores_de_tiempo_de_una_funcion_concreta()-