En este tutorial vamos a aprender a generar reportes personalizados en PDF a partir de datos de Google Sheets utilizando Google Apps Script y Google Docs. Esta técnica es súper útil para crear certificados, facturas, cotizaciones o cualquier tipo de documento que necesites automatizar con información que tienes en tus hojas de cálculo. Lo mejor es que no usaremos complementos externos, sino que haremos todo con código, lo que te dará mucha flexibilidad para personalizar y escalar el proceso según tus necesidades.
Ahora vamos a entrar en detalle para que entiendas cómo funciona cada parte y puedas replicarlo fácilmente en tus proyectos.
¿Por qué usar Google Docs como plantilla para generar PDFs?
Una de las preguntas que surge es: ¿por qué no generar el PDF directamente desde Google Sheets o desde el código? La respuesta sencilla es que crear un PDF a partir de un documento de Google Docs es mucho más sencillo y flexible. En Docs puedes crear una plantilla con formato, imágenes, encabezados y pies de página, y luego solo reemplazar las variables que necesites. Además, editar el documento es mucho más cómodo para ti o para cualquier persona que no domine código, ya que no hay que tocar HTML ni scripts complejos.
Preparando la estructura de archivos y la plantilla
Lo primero que haremos es organizar los archivos y carpetas en Google Drive para mantener todo ordenado. Crearemos dos carpetas:
- Carpeta Temporal: Aquí guardaremos las copias temporales de la plantilla mientras las modificamos.
- Carpeta PDFs: Aquí se guardarán los archivos PDF finales generados.
Luego, creamos un documento de Google Docs que servirá como plantilla. En este documento pondremos el texto base y las variables que queremos reemplazar. Por ejemplo:
Por medio de la presente certificamos que el alumno {{nombre}} {{apellido}} aprobó exitosamente el curso {{curso}} con una calificación de {{calificacion}} para la fecha {{fecha}}.
Las variables están entre dobles llaves {{variable}} para identificarlas fácilmente en el código y reemplazarlas por los datos reales que vienen de Google Sheets.
Conectándonos con Google Sheets, Docs y Drive desde Apps Script
El siguiente paso es abrir el editor de secuencias de comandos desde Google Sheets y crear una función llamada GenerarPDF. En esta función vamos a conectarnos con:
- El archivo de plantilla de Google Docs (usando su ID).
- Las carpetas de Drive para guardar las copias temporales y los PDFs.
- La hoja de cálculo activa y la pestaña donde están los datos.
Para obtener los ID de los archivos y carpetas, simplemente los copiamos desde la URL en Drive o Sheets, por ejemplo:
| Elemento | Ejemplo de ID |
|---|---|
| Plantilla Google Docs | 1a2b3c4d5e6f7g8h9i0j |
| Carpeta PDFs | 0j9i8h7g6f5e4d3c2b1a |
| Carpeta Temporal | 9z8y7x6w5v4u3t2s1r0q |
Con estos ID declaramos variables en el código para usarlas luego y facilitar cambios futuros.
Copiando la plantilla y reemplazando variables
Ahora vamos a crear una copia de la plantilla dentro de la carpeta temporal para trabajar sobre ella sin modificar el documento original. Usamos el método makeCopy(nombre, carpeta) de DriveApp para esto.
Luego abrimos este nuevo documento con DocumentApp y accedemos a su cuerpo para reemplazar las variables usando replaceText. Por ejemplo, para reemplazar {{nombre}} por el nombre real del alumno que está en la fila activa de Sheets.
const plantillaID = 'ID_DE_LA_PLANTILLA';
const carpetaPDFID = 'ID_CARPETA_PDF';
const carpetaTemporalID = 'ID_CARPETA_TEMPORAL';
function GenerarPDF() {
const hoja = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Datos');
const filaActiva = hoja.getActiveCell().getRow();
// Configuración de columnas
const colNombre = 2;
const colApellido = 3;
const colCurso = 4;
const colFecha = 5;
const colCalificacion = 6;
// Obtener datos de la fila activa
const nombre = hoja.getRange(filaActiva; colNombre).getValue();
const apellido = hoja.getRange(filaActiva; colApellido).getValue();
const curso = hoja.getRange(filaActiva; colCurso).getValue();
const fecha = hoja.getRange(filaActiva; colFecha).getDisplayValue(); // Para respetar el formato
const calificacion = hoja.getRange(filaActiva; colCalificacion).getValue();
// Obtener carpetas y archivo plantilla
const carpetaTemporal = DriveApp.getFolderById(carpetaTemporalID);
const carpetaPDF = DriveApp.getFolderById(carpetaPDFID);
const archivoPlantilla = DriveApp.getFileById(plantillaID);
// Crear copia de plantilla en carpeta temporal
const copiaArchivo = archivoPlantilla.makeCopy(`Reporte - ${nombre} ${apellido}`, carpetaTemporal);
const copiaID = copiaArchivo.getId();
// Abrir documento copia para editar
const documento = DocumentApp.openById(copiaID);
const cuerpo = documento.getBody();
// Reemplazar variables en el cuerpo del documento
cuerpo.replaceText('{{nombre}}', nombre);
cuerpo.replaceText('{{apellido}}', apellido);
cuerpo.replaceText('{{curso}}', curso);
cuerpo.replaceText('{{fecha}}', fecha);
cuerpo.replaceText('{{calificacion}}', calificacion);
documento.saveAndClose();
// Convertir documento a PDF y mover a carpeta PDFs
const pdfBlob = copiaArchivo.getAs('application/pdf');
carpetaPDF.createFile(pdfBlob).setName(`Certificado - ${nombre} ${apellido}.pdf`);
// Opcional: borrar archivo temporal
copiaArchivo.setTrashed(true);
}
Este código hace lo siguiente:
- Obtiene la fila activa donde está el cursor en Sheets para saber qué datos usar.
- Lee las celdas correspondientes a nombre, apellido, curso, fecha y calificación.
- Crea una copia de la plantilla en la carpeta temporal para no modificar el original.
- Abre la copia y reemplaza las variables con los datos reales.
- Guarda y cierra el documento.
- Convierte la copia en PDF y la guarda en la carpeta de PDFs con un nombre personalizado.
- Elimina la copia temporal para no dejar archivos innecesarios.
Cómo ejecutar el script desde Google Sheets
Para facilitar la ejecución, puedes crear un menú personalizado en Google Sheets que llame a la función GenerarPDF con solo un clic. Así no tienes que entrar al editor cada vez. Aquí te dejo un ejemplo rápido para crear este menú:
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('Reportes')
.addItem('Generar certificado PDF', 'GenerarPDF')
.addToUi();
}
Con esto, al abrir tu hoja de cálculo verás un menú llamado Reportes desde donde podrás generar el PDF para la fila donde estés posicionado.
Conclusión
En este tutorial vimos cómo crear un sistema básico para generar reportes PDF personalizados a partir de datos en Google Sheets usando Google Apps Script y Google Docs como plantilla. Aprendimos a:
- Crear y organizar carpetas en Drive para manejar archivos temporales y finales.
- Preparar una plantilla en Google Docs con variables para reemplazar.
- Conectarnos con Google Sheets, Docs y Drive desde Apps Script.
- Copiar la plantilla, reemplazar variables y generar un PDF.
- Automatizar la ejecución con un menú personalizado en Sheets.
Este método es muy versátil y puede extenderse para generar múltiples PDFs en lote, enviar correos automáticos con los archivos adjuntos, o crear reportes más complejos con imágenes y formatos avanzados.
Si quieres aprender a usar Google Forms y Google Sheets desde cero, te invito a tomar un curso gratis de 2 horas.