Mostrando entradas con la etiqueta Crear PDFs. Mostrar todas las entradas
Mostrando entradas con la etiqueta Crear PDFs. Mostrar todas las entradas

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.



martes, 22 de junio de 2021

Enviar pdf por correo desde un formulario

 Este es un ejemplo con todas las partes que necesita el código para mandar un pdf a ciertos grupos.

Falta crear los intervalos con nombre necessarios. El más importante es "ultima_fila"

Además utilizamos dentro de las fórmulas: marca_temporal y grupos_correos

También, para conseguir datos, carpeta_url y plantilla_url

Además, por cada campo que queramos incluir en el pdf, utilizamos "jarduera_actividad" y "maila_curso" que toman toda la columna de cada campo. Si necesitamos más datos en el pdf, deberíamos crear los intervalos con nombre necesarios asociados a cada dato.

function enviar_pdf() {
  // variables básicas
  var herramienta = SpreadsheetApp.getActiveSpreadsheet()
  var ultima_fila = herramienta.getRangeByName('ultima_fila').setValue 
('=filter(row(marca_temporal);marca_temporal=max(marca_temporal))').getValue()
  var pestana = herramienta.getRangeByName('ultima_fila').getSheet()

  // variables de carpeta y de plantilla
  var carpeta_id = herramienta.getRangeByName('carpeta_url')
.getValue().match(/[-\w]{25,}/)

  var plantilla_id = herramienta.getRangeByName('plantilla_url')
.getValue().match(/[-\w]{25,}/)


// Variables que se rellenan en la plantilla, de columna y variable
    var columna_jarduera_actividad = herramienta.getRangeByName('jarduera_actividad')
.getColumn()
    var jarduera_actividad = pestana.getRange(ultima_fila, columna_jarduera_actividad)
.getValue()
    
    var columna_maila_curso= herramienta.getRangeByName('maila_curso').getColumn()
    var maila_curso = pestana.getRange(ultima_fila, columna_maila_curso).getValue() 
 
            
 // Conseguimos la carpeta    y creamos la copia basada en la plantilla
  var carpeta = DriveApp.getFolderById(carpeta_id) 
  var nuevo_documento_id = DriveApp.getFileById(plantilla_id).
 makeCopy('nuevo', carpeta).getId()
  var nuevo_documento = DocumentApp.openById(nuevo_documento_id)
  
// Entramos y cambiamos

  var body = nuevo_documento.getBody()
  
  body.replaceText('<<JARDUERA/ACTIVIDAD>>', jarduera_actividad)
 

    
  
// Cerramos
nuevo_documento.saveAndClose()


// Variables para el correo
var arduraduna = herramienta.getRangeByName('arduraduna').getValue()
var ikasketaburua= herramienta.getRangeByName('ikasketaburua').getValue()

var titulo= herramienta.getRangeByName('titulo').getValue()
var mensaje= herramienta.getRangeByName('mezua').getValue()
var correo

// Convertimos en pdf
var pdf =DriveApp.createFile(nuevo_documento.getAs('application/pdf')
.setName(titulo+' -- '+data_fecha+'.pdf')) 


// Pillamos todos los grupos
var array_grupos = maila_curso.split(",")
Logger.log(array_grupos)


// Mandamos a cada correo
for (grupo in array_grupos){
              correo = pestana.getRange('cada_correo')
.setValue('=iferror(vlookup("'+array_grupos[grupo].trim()+'";grupos_correos;2;false))')
.getValue()
             var opciones ={attachments: pdf ,bcc:arduraduna  ,cc:ikasketaburua}
       MailApp.sendEmail(correo, titulo, mensaje, opciones)
                           }

// Borramos el documento
  pdf.setTrashed(true)
//  DriveApp.getFileById(nuevo_documento_id ).setTrashed(true)
}

jueves, 17 de mayo de 2018

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ña de hoja de cálculo en PDF
Ventajas: El código permite crear el PDF con orientación horizontal, por lo que queda mucho más bonito y adecuado.
Características: El código te permite configurar varias opciones, además de la orientación de la página. Hemos metido un mensaje emergente para  que el usuario pueda elegir la pestaña y otro para que pueda configurar a que correo quiere que le llegue el PDF.

Este es el código:


function pdf_hor(){

// Creamos las variables de la hoja de cálculo
     var libro =SpreadsheetApp.getActiveSpreadsheet()
 // Pedimos la pestaña a convertir
    var nombre = Browser.inputBox('Dime la pestaña que quieres convertir en pdf')
  // Conseguimos la pestaña
    var pestana = libro.getSheetByName(nombre)
   // Creamos la URL con todas las variables de configuración
    var url = 'https://docs.google.com/spreadsheets/d/'+libro.getId()+'/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
  + '&size=A4'                           // paper size legal / letter / A4 // Elegimos el tamaño del papel
  + '&portrait=false'                     // orientation, false for landscape // Elegimos la orientación
  + '&fitw=true'                        // fit to page width, false for actual size // Elegimos si se extiende el contenido a toda la página
  + '&sheetnames=false&printtitle=false' // hide optional headers and footers // Elegimos si imprimimos cabecera con nombre de hoja
  + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines // Elegimos si aparecen número de página y líneas de celdas
  + '&fzr=false'                         // do not repeat row headers (frozen rows) on each page // Elegimos si repetimos primera línea en diferentes páginas
  + '&gid='+pestana.getSheetId();    // the sheet's Id // Si quitamos esta línea, conseguiremos que imprima todas las pestañas

  var token = ScriptApp.getOAuthToken();

  var response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  var theBlob = response.getBlob().setName(pestana.getName()+'.pdf');

  var newFile = DriveApp.createFile(theBlob);
  // Al mandar el correo, con la siguiente variable configuramos el mensaje
  var contenido_email= '<b>Aviso de mantenimiento</b>'
  var opciones= { htmlBody: contenido_email,  attachments: newFile};
  var correo = Browser.inputBox('Dime el correo a quien quieres mandar el pdf')
  // Mandamos el mensaje con el título "Mantenimiento". Lo podemos cambiar, pero siempre manteniendo las comillas
  MailApp.sendEmail(correo, 'Mantenimiento', contenido_email, opciones)
  // Borramos el PDF creado en nuestro Drive, para que no quede copia cada vez que mandamos el PDF por correo
  newFile.setTrashed(true)
}

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