sábado, 26 de mayo de 2018

Abrir o cerrar formulario con código

Hay veces que queremos que una encuesta se pueda contestar en un determinado plazo de tiempo, pero no recibir respuestas ni antes ni después. Esto lo podemos configurar manualmente en cada formulario.
Pero, en un sistema de reclamaciones de exámenes, me pidieron que se abriese o cerrase el formulario varias veces, dependiendo de un calendario específico para cada una de una lista de asignaturas.

Un bonito reto para hacerlo con código.

Supuse que el mejor sitio para escribir el código era el propio formulario. Fué bastante sencillo y rápido, ya qu enseguida encontré el método "setAcceptingResponses(true)" que es el que nos permite, cambiando entre "true" y "false" aceptar o no respuestas. Peeeero, la lógica  es que corriese el código todo los días para comparar la fecha con la de abrir o cerrar según cada asignatura y, por desgracia, los activadores de un formulario se limitan a "abrir" (abrir el formulario en modo edición) o "al enviar el formulario" (momento poco adecuado para abrir o cerrar las respuestas)

Superada la fustración, pensé en hacerlo desde la hoja de cálculo de respuestas, ya que estas tienen bastantes más activadores y, sobre todo, el de "cada día" a una hora concreta.
Este es el código:

function puerta() {
  // Enlazamos a la hoja de cálculo
  var aplicacion = SpreadsheetApp.getActiveSpreadsheet()
  // Enlazamos a la pestaña donde se recogen las respuestas del formulario en cuestión
  // Esta hoja de cálculo tiene mas formularios, por lo que es imprescindible enlazar a la pestaña que está unida al formulario que queremos

  var reclamaciones = aplicacion.getRangeByName('reclamaciones').getSheet()
 
  //Desde la pestaña conseguimos la URL del formulario
  var formulario = reclamaciones.getFormUrl()
  // Y gracias a la clase FormApp lo abrimos
  var formu =FormApp.openByUrl(formulario)

// Para abrir o cerrar necesitamos la fecha de HOY para compararla con las fechas de abrir o cerrar
  var hoy = new Date();
// Pero he tenido problemas con new Date() ya que recoge también la hora y así no se puede comparar
  // Por lo que he extraído solamente la fecha

     var dd = hoy.getDate();
     var mm = hoy.getMonth()+1;
     var yyyy = hoy.getFullYear();
     hoy = dd+'/'+mm+'/'+yyyy;

// En la pestaña de configuración (donde está el intervalo con nombre "config" tenemos las fechas de apertura y cierre en 11 líneas diferentes
var configuracion = aplicacion.getRangeByName('config').getSheet()
var fechas_apertura = configuracion.getRange('b17:b27').getValues()
var fechas_cierre = configuracion.getRange('d17:d27').getValues()

// Creamos un bucle para recorrer todas las fechas de apertura
    for (fecha in fechas_apertura){
      var esta_fecha = fechas_apertura[fecha]
// Y vemos si hoy es igual al día que hay que abrir
                       if (esta_fecha==hoy){
// En caso afirmativo ponemos en true aceptar respuestas en el formulario
                       var control = formu.setAcceptingResponses(true)
                         }
     }

 
// Creamos un segundo bucle con las fechas de cierre 
    for (fecha2 in fechas_cierre){ 
      var esta_fecha2 = fechas_cierre[fecha2]
// Y vemos si hoy es igual al día que hay que cerrar
                        if (esta_fecha2==hoy){
// En caso afirmativo ponemos en false aceptar respuestas en el formulario, osea cerramos
                        var control = formu.setAcceptingResponses(false)
                          }
     }

}


Me costó encontrar como acceder desde la hoja de cálculo a la configuración del formulario. Al final descubrí que es gracias a la clase FormApp con el dato de getFormUrl() de esta forma:
  var formulario = reclamaciones.getFormUrl()
  var formu =FormApp.openByUrl(formulario)


Pero, también estaba la cuestión de conseguir elegir uno de los varios formularios que tenía la hoja de cálculo. Y aquí el truco es hacerlo desde la pestaña que recoge las respuetas de cada uno de los formularios. En este caso aplicacion.reclamaciones.getFormUrl(), siendo "reclamaciones" la pestaña en cuestión.

Para que funcione necesitamos ir a "Activadores del proyecto activo" y configurarlo con "Basado en el tiempo", "Temporizador por día", "la hora que os parezca bien"

No hay comentarios:

Publicar un comentario

Crear PDF horizontal

El código que vamos a mostrar aquí no ha sido creado por nosotros, sino que lo hemos encontrado en Internet. Objetivo: Publicar una pesta...