Como modificar formularios con google apps scripts


Los formularios de Google son una herramienta de entrada de datos tremendamente poderosa pero son tediosos de mantener, es por ello que los scripts de Google pueden ser de una tremenda ayuda para automatizar el proceso de mantenimiento de los formularios, permitiéndonos ahorrar tiempo y dinero.

El código para acceder a los datos de un formulario es sencillo pero requiere de práctica. Te recomiendo que con la base de este código vayas investigando para aprender a modificar de nuevas maneras los formularios de google.

El código que te mostraré aquí (solo es un ejemplo) se encarga de actualizar un campo en concreto para que sea un desplegable que tenga como opciones los nombres de las subcarpetas que existan en una cierta carpeta. Esto se puede modificar para que actualice en base a la información de ciertos ficheros o de cualquier otra información que se desee.

Aquí tenéis el código:

function onOpen()
{
    GetListOfFolders();
}

function GetListOfFolders()
{
   var folders = DriveApp.getFolderById("CARPETA CONTENEDORA DE SUBCARPETA").getFolders();

   var form = FormApp.getActiveForm();
   var items = form.getItems();

   var list = items[0].asListItem();
 
   var values = new Array();
   while ( folders.hasNext() )
   {
      var f = folders.next();
      var name = f.getName();
      values.push(name);
   }

   list.setChoiceValues(values);
}

8 comentarios:

  1. Me da error esta linea, es posible?


    var items = form.getItems();

    ResponderEliminar
    Respuestas
    1. Buenas,

      Creo que se por que te falla.
      Esto debería haberlo explicado un poco mejor. El código lo has puesto dentro de un formulario o de un spreadsheet??
      var form = FormApp.getActiveForm(); Solo te va a devolver un elemento válido si estás dentro de un formulario, si estás dentro de un spreadsheet te va a devolver null y evidentemente no puede hacer getitems de null.

      Es fallo mio que no lo expliqué bien... a la que tenga un momento lo modifico.

      Gracias por verlo.

      Eliminar
  2. Buenas tardes.
    Soy Ferran Castro, y aplico GAS en diversos proyectos de una escuela.
    En primer lugar, quisiera felicitarte (y agradecerte) por la labor que haces con la difusión de este lenguaje de programación.

    En estos momentos, me estoy encontrando con el siguiente problema:
    Tengo unos formularios, que recogen una información en unas hojas de cálculo. Estas hojas, estan configuradas con unas fórmulas, de manera que, cuando se acumulan unos valores, los va contando y los anota en una columna.
    Un script de GAS, lee la hoja de cálculo y, cuando se ha acumulado un valor determinado, envia un correo a dos personas, dando un aviso de terminado (espero que se entienda mi explicación).
    El problema que tengo es que, cuando se introducen datos nuevos en el formulario, este inserta una fila nueva y desplaza hacia abajo las ya existentes, dejando esta nueva fila sin fórmulas y,por tanto, invalidando el funcionameniento del sistema. De momento, entro y lo soluciono de manera manual.
    He intentado crear un script que "repare" la hoja de cálculo de manera automática, ascribiendo la fórmula. El problema es que, cuando guardo la fórmula en una variable, esta contiene comillas y paréntesis, y el scrip lo considera parte de la sintaxis del lenguaje, con lo que me da error al guardarlo o ejecutarlo.
    ¿Como se podria hacer para que no de este error?
    El código es el diguiente:

    function reparar(){

    var sps = SpreadsheetApp.openByUrl("https://docs.google.com/***");
    var sheet = sps.getSheets();
    var formula1="==IFERROR(INDEX($B$2:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$2:$B$251););));"")";
    var formula2="==IFERROR(INDEX($B$3:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$3:$B$251););));"")";
    var formula3="==IFERROR(INDEX($B$4:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$4:$B$251););));"")";
    var formula4="==IFERROR(INDEX($B$5:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$5:$B$251););));"")";
    var formula5="==IFERROR(INDEX($B$6:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$6:$B$251););));"")";


    sheet[0].getRange(2, 4).setValue(formula1);
    sheet[0].getRange(3, 4).setValue(formula2);
    sheet[0].getRange(4, 4).setValue(formula3);
    sheet[0].getRange(5, 4).setValue(formula4);
    sheet[0].getRange(6, 4).setValue(formula5);
    }

    ResponderEliminar
  3. Bona nit Ferran,

    Esto es una cosa que pasa en muchas ocasiones. Se empieza un proyecto con formulas, se tiene que seguir con script , se mezcla todo y acaba en desastre. No eres el primero ni serás el último al que le pase, tranquilo.

    Soluciones:
    1. Pasarlo todo a script. Te olvidas de las formulas y lo picas en código. Para mi es la mejor solución, pero evidentmente es la que más trabajo genera. Si te decantas por esta opción, si tienes dudas te puedo ayudar gratis. Si quieres que lo haga yo todo, algo te debería cobrar :)(https://www.fiverr.com/franciscobordas/write-a-simple-custom-script-for-your-google-sheets), aunque siendo un cole ya te digo que no pasaría de los 5$.

    2.Parchear para que las formulas no se rompan. Es la opción por la que es optado tu. A priori, no es lo aconsejable, por que es como una casa sin cimientos que cada cierto tiempo alguien quiere amplia el edificio poniendole más plantas. Acaba en desastre, pero entiendo los motivos por lo que lo has hecho. Solo quiero que seas consciente que no es una opción mantenible en el tiempo.

    En cuanto a tu pregunta, tienes dos fallos.
    1. Te sobran las comillas que hay justo antes del cierre de parentesis
    2. Has de utilizar setFormula en vez de setValue

    Te deberia quedar algo como esto:
    var formula1="==IFERROR(INDEX($B$2:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$2:$B$251););));)";
    var formula2="==IFERROR(INDEX($B$3:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$3:$B$251););));)";
    var formula3="==IFERROR(INDEX($B$4:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$4:$B$251););));)";
    var formula4="==IFERROR(INDEX($B$5:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$5:$B$251););));)";
    var formula5="==IFERROR(INDEX($B$6:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$6:$B$251););));)";

    sheet[0].getRange(2, 4).setFormula(formula1);
    sheet[0].getRange(3, 4).setFormula(formula2);
    sheet[0].getRange(4, 4).setFormula(formula3);
    sheet[0].getRange(5, 4).setFormula(formula4);
    sheet[0].getRange(6, 4).setFormula(formula5);

    Espero que te haya servido.

    Nos vemos!

    ResponderEliminar
  4. Hola Pako.
    Gracias por la rapidísima respuesta.
    La opción de hacerlo con código, la habia pensado, pero, tal y como dices, da mas trabajo y quería probarlo por esta vía. En un principio, creo que lo podré hacer yo (si no lo consigo, recurriré e tí;-)). Me gusta pelearme con el código. He comprobado que es la mejor manera de aprender (y me queda muchíiiisimo!!).
    Las comillas que me comentas, en principio forman parte de la fórmula. Probaré si ellas a ver.
    Y, vaya fallo mas tonto lo de setFormula.
    Por cierto, he leido por ahí que te gusta el rol (El señor de los anillos). Me ha llamado la atención por que yo soy máster des de hace muchos años (cuando salió la primera edición del libro de reglas), y todavía sigo haciendo partidas de vez en cuando. De hecho, se lo he contagiado a mi hija y a mi cuñado (jeje).
    En fin, saludos y, lo dicho, muchas gracias por la ayuda.

    ResponderEliminar
    Respuestas
    1. Buenas,

      Ciertamente la única manera de aprender es pelearse con el problema.

      Si las comillas te hacen falta ( la verdad, he ido rápido y no me he fijado) deberías ponerle delante de cada comilla un barra hacia la izquierda \" :
      var formula1="==IFERROR(INDEX($B$2:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$2:$B$251););));\"\")";
      var formula2="==IFERROR(INDEX($B$3:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$3:$B$251););));\"\")";
      var formula3="==IFERROR(INDEX($B$4:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$4:$B$251););));\"\")";
      var formula4="==IFERROR(INDEX($B$5:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$5:$B$251););));\"\")";
      var formula5="==IFERROR(INDEX($B$6:$B$251;MATCH(0;INDEX(COUNTIF($D$1:D1;$B$6:$B$251););));\"\")";

      Y si, durante muchos años jugué a rol y le debo mucho ( de hecho conocí a mi mujer en un club de rol :) ), pero ahora mismo soy rolero no practicante. No tengo el tiempo ni el circulo de amistades para seguir haciendolo, aunque lo añoro la verdad.

      Ya me contarás como te va.

      Eliminar
  5. Lo acabo de probar, y, sin las comillas del final, me da error. Y con las comillas, no compila correctamente (uff...)

    ResponderEliminar
    Respuestas
    1. Te he puesto el comentario arriba: prueba con \"

      Eliminar

Related Posts Plugin for WordPress, Blogger...