Skip to main content

Lista a tabs

Transformación de Lista a Documentos Individuales en Google Sheets

 

A menudo, nos encontramos con una lista en formato de diario o mayor en Google Sheets, donde cada fila representa un documento que deseamos generar de forma individual, basándonos en los datos de esa línea específica. Para facilitar este proceso, podemos utilizar una combinación de una hoja para la lista, una plantilla para el documento deseado, y un script personalizado que genere nuevas pestañas (tabs) rellenas automáticamente.

 

Preparativos Iniciales

Captura de pantalla 2024-03-22 152953.png

  1. Crear una Pestaña con la Lista: Esta pestaña contendrá tu lista tipo diario o mayor, donde cada fila se corresponde con los datos de un documento específico.

  2. Diseñar una Plantilla de Documento: En otra pestaña, elabora una plantilla del documento que deseas generar. Asegúrate de numerar adecuadamente cada campo relevante en la cabecera, esto servirá más adelante para mapear los datos correctamente.

  3. Visualizar Ejemplos de la Configuración: Observa los siguientes ejemplos visuales para tener una idea clara de cómo estructurar tus pestañas de lista y plantilla.

    • Configuración de la Lista:

Captura de pantalla 2024-03-22 152907.png

  • Ejemplo de Plantilla:

Captura de pantalla 2024-03-22 153139.png

Implementación del Script

Para iniciar el proceso de generación automática de documentos:

  1. Dirígete a Extensiones > App Script.
  2. En el entorno de App Script, prepara y ejecuta el siguiente código:

Captura de pantalla 2024-03-22 153248.png

Codigo App Script asociado
function generarFacturas() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getSheetByName("NombrePlantilla"); // Cambia esto por el nombre real de tu pestaña de plantilla
  var dataSheet = ss.getSheetByName("LibroFacturasEmitidas"); // Asegúrate de usar el nombre correcto de tu hoja de datos
  var dataRange = dataSheet.getDataRange();
  var data = dataRange.getValues();
  
  for (var i = 6; i < data.length-1; i++) { // Empieza en 1 para omitir el encabezado  data.length
    var invoiceData = data[i];
    var newSheet = ss.insertSheet(invoiceData[4]); // Usa un identificador único para cada factura, aquí se usa el número de factura
    templateSheet.getRange('A1:Z100').copyTo(newSheet.getRange('A1'), {contentsOnly:false});
    

    // Ajusta las columnas y las filas al tamaño de la plantilla
    var maxColumns = newSheet.getMaxColumns();
    var maxRows = newSheet.getMaxRows();
    
    if(maxColumns > 5) { // Si hay más de 5 columnas, elimina las excedentes
      newSheet.deleteColumns(6, maxColumns - 5);
    }
    
    if(maxRows > 24) { // Si hay más de 24 filas, elimina las excedentes
      newSheet.deleteRows(25, maxRows - 24);
    }

    // Copia la anchura de las columnas de la plantilla a la nueva hoja
    var numColumns = templateSheet.getMaxColumns();
    for (var j = 1; j <= numColumns; j++) {
      var columnWidth = templateSheet.getColumnWidth(j);
      newSheet.setColumnWidth(j, columnWidth);
    }




    // Aquí, reemplaza los datos de la plantilla con los de invoiceData usando setValues() o setValue()
    // Por ejemplo: newSheet.getRange('B12').setValue(invoiceData[1]); donde B2 es donde va el nombre del cliente
    // Repite para cada dato relevante de la factura
    //nombre
    //newSheet.getRange('B12').setValue(invoiceData[14]);
    newSheet.getRange('B12').setValue(invoiceData[15]); // Supongamos que esto es el Nombre/Razón Social
    newSheet.getRange('B13').setValue(invoiceData[14]); // NIF
    newSheet.getRange('B14').setValue(invoiceData[5]);  // Dirección (ajustar según corresponda)
    newSheet.getRange('C12').setValue(invoiceData[0]);  // Número de Factura
    newSheet.getRange('C15').setValue(invoiceData[2]);  // Fecha de Factura
    newSheet.getRange('B19').setValue(invoiceData[6]); // Concepto de Factura
    newSheet.getRange('D19').setValue(invoiceData[7]);  // Base Imponible
    //newSheet.getRange('F20').setValue(invoiceData[7]);  // % IVA
    //newSheet.getRange('F21').setValue(invoiceData[11]);  // Total IVA


  }
  
  SpreadsheetApp.flush(); // Asegura que todos los cambios se apliquen antes de finalizar el script
}

 

Consejos para la Implementación:

  • Pruebas Iniciales: Para las primeras ejecuciones, limita el bucle for para procesar solo 2 o 3 filas. Esto facilita ajustar los mapeos
  • Refactorización: desaconsejo refactorizar al estar claros los bloques y ser personalizados en cada uso