viernes, 29 de octubre de 2021

Variables al vuelo mediante código

 Como publicaba en este artículo es fácil crear un código que consiga mandar un pdf con la información enviada desde un formulario.

En dicho código existen dos partes ( creación de variables y asignación de contenido a las partes del pdf) que podemos solucionar en unas pocas líneas aunque las preguntas del formulario sean incontables.

Para aclarar de lo que hablo, os explico de antemano cual el proceso:

- El usuario manda un formulario con una serie de respuestas a diferentes preguntas

- El código crea una variable por cada pregunta del formulario

- En una plantilla tenemos dichas preguntas convertidas en variables

- El código introduce en una copia de la plantilla cada respuesta en cada variable, gracias a replaceText


Me ha tocado hacer este proceso con formularios que tenían alrededor de 50 preguntas, por lo que me he encontrado en la tesitura de declarar 50 variables (una por cada pregunta del formulario) y, por lo tanto, crear otras 50 líneas más de código con replaceText.

Me sugerieron intentar hacerlo con bucles, pero no veía como se podía declarar variables de forma indirecta: 

Y aquí aparece eval() que hace que lo que pongamos entre paréntesis lo corra como código dentro del código

Para poder entenderlo os reto a crear un bucle para crear las 50 variables.

Yo intenté algo así:

// Recogo las 50 preguntas desde la hoja de cálculo con un intervalo con nombre

var todas_las_preguntas =  SpreadsheetApp.getActiveSpreadsheet().getRangeByName('variables').getValues()

// Creo el bucle para recorrerlas e intentar crear una variable por pregunta

for (fila in todas_las_preguntas){

var mivariable&fila

}

// Y me encuentro conque no hay forma de nombrar a cada variable de una forma distinta. La declaración var mivariable&fila da error y no hay forma de que no de (que yo sepa)


Y ahí viene a salvarnos eval()

for (fila in todas_las_preguntas){

var nombre = todas_variables[fila][0]

eval("var "+nombre)

}

Y, así conseguimos crear tantas variables como preguntas tiene el formulario

En mi caso queda así:

var numero
for (fila in todas_variables){
  var nombre =todas_variables[fila][0]
numero = parseInt(fila)+parseInt(1)
eval("var "+nombre+"= pestana.getRange(ultima_fila,"+numero+").getValue()")
}

Aprovecho la declaración de la variable para asignarle el valor de la ultima fila de la pestaña de respuestas del formulario y de la columna donde está la pregunta, así consigo la respuesta de cada pregunta

Eso sí, cuando voy a la parte del código de replaceText, vuelvo a utilizar el bucle para recorrer todas las preguntas y necesito utilizar eval() otra vez

for (cada in todas_variables){

var variable = todas_variables[cada][0]

body.replaceText('<<'+todas_variables[cada][0]+'>>', eval(variable))

}


Me da la sensación de que no me he explicado muy bien. Si alguien quiere aclararse más, que se ponga en contacto conmigo y le enseño la aplicación en vivo.



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...