Skip to main content

Lista a tabs

Transformación de Lista a Documentos Individuales en Google Sheets

En ocasiones

tenemos

A menudo, nos encontramos con una lista tipoen formato de diario o mayor,mayor en elGoogle queSheets, donde cada fila se corresponde arepresenta un documento yque queremosdeseamos generar unde documentoforma completoindividual, abasándonos partir deen los datos de esa línea deespecífica. información.

Para ellofacilitar incorporamoseste 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 tabla,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 conpestaña, elabora una plantilla del documento que queremosdeseas ygenerar. unAsegúrate scriptde quenumerar adecuadamente cada campo relevante en la cabecera, esto servirá más adelante para mapear los recorradatos generando las nuevas pestañas rellenas.correctamente.

    Captura de pantalla 2024-03-22 152953.png

  3. EnVisualizar la cabecera numeramosEjemplos de la siguienteConfiguración: forma,Observa los siguientes ejemplos visuales para tener una buenaidea referencia,clara luegode veremoscómo paraestructurar quetus hacemospestañas esto.de lista y plantilla.

    • Configuración de la Lista:

Captura de pantalla 2024-03-22 152907.png

La

    plantilla
  • Ejemplo seriade algoPlantilla:
  • asi:

Captura de pantalla 2024-03-22 153139.pngCaptura de pantalla 2024-03-22 153139.png

Implementación del Script

EntoncesPara nosiniciar vamosel a:proceso "Extensions-de generación automática de documentos:

  1. Dirígete a Extensiones > App Script"

    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
}

 

EnConsejos para la primeraImplementación:

revisión,
    recomiendo
  • Pruebas cambiarIniciales: Para las primeras ejecuciones, limita el límitebucle del for,for para queprocesar recorrersolo 2 o 3 elementosfilas. paraEsto pulirfacilita ajustar los ajustes,mapeos
  • luego
  • Refactorización: cambiamosdesaconsejo refactorizar al estar claros los gerange con las celdas de destinobloques y losser "invoiceData" con el código de columna que informamospersonalizados en elcada segundouso
  • paso.