Cómo generar PDFs personalizados desde Google Sheets con Apps Script

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:

ElementoEjemplo de ID
Plantilla Google Docs1a2b3c4d5e6f7g8h9i0j
Carpeta PDFs0j9i8h7g6f5e4d3c2b1a
Carpeta Temporal9z8y7x6w5v4u3t2s1r0q

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

JuanSGuzman
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.