Cómo crear documentos desde una plantilla a partir de los datos de una hoja de cálculo con Google Drive

Cómo crear documentos desde una plantilla a partir de los datos de una hoja de cálculo con Google Drive

En esta entrada vamos a ver una opción muy útil de Google Drive, que nos permite crear varios nuevos documentos de texto rellenando una plantilla con los datos que tenemos en una hoja de cálculo. Es decir, queremos generar documentos (tipo Word) con una estructura determinada a partir de los datos de la hoja de cálculo.

Para ello usaremos una aplicación poco conocida, que se llama Apps Script.

Esta aplicación la podemos usar para multitud de aplicaciones, por ejemplo:

  • Crear un dorsal por cada uno de los inscritos en una carrera.
  • Generar un documento con las notas de cada alumno (actas, etc).
  • Generar facturas.

Seguro que se te ocurren muchas más aplicaciones.

De momento este ejemplo lo vamos a hacer lo más sencillo posible. Pero si quieres esta aplicación nos permite muchas más opciones (las iremos viendo más adelante): Exportarlo como PDF, mandarlo por email, generar los documentos en el mismo momento en el que rellenan un formulario, …

Podéis verlo en el siguiente vídeo o seguir leyendo paso a paso.

Primer paso: Generamos la plantilla – Documento de texto

El primer paso va a ser generar un documento de texto con la plantilla dentro de Google Drive.

Si quieres, una buena idea sería crear una carpeta para todos estos documentos que vamos a generar.

En mi caso he hecho una muy sencilla, pero la puedes complicar todo lo que quieras. Este es mi documento de plantilla. Fíjate que donde quiero que ponga cada uno de los datos lo he marcado de una forma especial. En mi caso quiero que donde he puesto {nombre} lo cambie por el nombre y donde he puesto {nota} lo cambie por la nota

Plantilla documento de texto

¡Ya la tenemos! Pues ahora necesitamos copiar el ID de la plantilla. Lo debes coger desde la barra de direcciones, el que está entre las dos / (es el código que marco en rosa en mi caso, en tu caso tendrás que coger el de tu documento):

id del documento

Segundo paso: Creamos la hoja de cálculo

Vamos a crear la hoja de cálculo desde Google Drive. En mi caso tengo una hoja muy sencilla con sólo dos columnas: Nombre y Nota.

Datos de hoja de cálculo excel

¿Ya lo tienes? Pues repetimos el paso anterior y copiamos el ID del documento, tal y como hemos hecho antes con el documento de la plantilla.

Tercer paso: Abrimos Apps Script y creamos nuestra función

Ahora viene donde se pone interesante. Vamos, desde la hoja de cálculo a «Extensiones» y «Apps Script»

Quizá te pida permisos para abrirse, se los debemos conceder.

Tendremos que borrar el código que sale y pegar este código que os proporciono a continuación (lo puedes copiar de aquí y pegarlo).

IMPORTANTE:

  • Cambia el identificador del documento de texto, poniendo el tuyo
  • Recuerda que las columnas deben llamarse igual en el documento de texto y en la hoja de cálculo
function generarDocs() {
  const docTemplateId = 'AQUI_PON_EL_IDENTIFICADOR_DEL_DOCUMENTO_DE_TEXTO';
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data[0]; // Encabezados están en la fila 1 (índice 0)

  const folder = DriveApp.getFileById(ss.getId()).getParents().next();

  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const nombreArchivo = `Documento - ${row[0] || 'sin_nombre'}`;

    const docCopia = DriveApp.getFileById(docTemplateId).makeCopy(nombreArchivo);
    const doc = DocumentApp.openById(docCopia.getId());
    const body = doc.getBody();

    const totalElements = body.getNumChildren();
    for (let elIndex = 0; elIndex < totalElements; elIndex++) {
      const element = body.getChild(elIndex);
      if (element.getType() === DocumentApp.ElementType.PARAGRAPH ||
          element.getType() === DocumentApp.ElementType.TABLE) {
        replaceInElement(element, headers, row);
      }
    }

    doc.saveAndClose();

    // Mover a carpeta original
    // Aunque están marcadas como deprecated, estas líneas son necesarias
    // para mover el archivo generado a la misma carpeta que la hoja de cálculo.
    folder.addFile(DriveApp.getFileById(doc.getId()));
    DriveApp.getRootFolder().removeFile(DriveApp.getFileById(doc.getId())); // Remover del root
  }
}

function replaceInElement(element, headers, rowData) {
  const elementType = element.getType();

  if (elementType === DocumentApp.ElementType.PARAGRAPH) {
    const text = element.asParagraph().editAsText();
    reemplazarVariables(text, headers, rowData);
  } else if (elementType === DocumentApp.ElementType.TABLE) {
    const table = element.asTable();
    for (let r = 0; r < table.getNumRows(); r++) {
      const row = table.getRow(r);
      for (let c = 0; c < row.getNumCells(); c++) {
        const cell = row.getCell(c);
        const cellText = cell.editAsText();
        reemplazarVariables(cellText, headers, rowData);
      }
    }
  }
}

function reemplazarVariables(textElement, headers, rowData) {
  for (let j = 0; j < headers.length; j++) {
    const variable = `[${headers[j]}]`;
    let valor = rowData[j];

    // Redondear si es número
    if (typeof valor === 'number') {
      valor = Math.round(valor * 100) / 100;
    }

    valor = valor != null ? valor.toString() : '';

    let startOffset = 0;
    while (true) {
      const index = textElement.getText().indexOf(variable, startOffset);
      if (index === -1) break;
      textElement.deleteText(index, index + variable.length - 1);
      textElement.insertText(index, valor);
      startOffset = index + valor.length;
    }
  }
}

Cuarto paso: Ejecutamos

Ya lo tenemos todo listo, llega el momento de la verdad ¡vamos a ejecutar!

Dale al botón de ejecutar (y si te pide permisos se los tendrás que dar):

apps script de Google Drive

Aparecerá una consola que te dirá que se está ejecutando.

En la misma carpeta en la que tienes tu hoja de cálculo se generarán varios documentos, uno por cada una de las filas. Tienes que darle un poco de tiempo (unos minutos) para que se ejecute por completo y rellene todos los datos. Debes esperar hasta que te indique que la ejecución ha finalizado.

Después comprueba que están correctos.

informes generados desde excel
Informes word desde datos excel

¿Sabes que con Apps Script puedes hacer que estos informes se envíen por email de forma automática? ¿o que se creen los documentos conforme se reciben respuestas en un formulario?

Más adelante iremos haciendo más ejemplos más complicados. Ahora de momento para comenzar no está nada mal con este ejemplo sencillo ¿no te parece?

Deja una respuesta

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