Skip to main content

Lista a tabs

En ocasiones tenemos una lista tipo diario o mayor, en el que cada fila se corresponde a un documento y queremos generar un documento completo a partir de los datos de esa línea de información.

Para ello incorporamos una pestaña con la tabla, otra con una plantilla del documento que queremos y un script que los recorra generando las nuevas pestañas rellenas.

Captura de pantalla 2024-03-22 152953.png

En la cabecera numeramos de la siguiente forma, para tener una buena referencia, luego veremos para que hacemos esto.

Captura de pantalla 2024-03-22 152907.png

La plantilla seria algo asi:

Captura de pantalla 2024-03-22 153139.png

Entonces nos vamos a: "Extensions->App Script"

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
}

 

En la primera revisión, recomiendo cambiar el límite del for, para que recorrer 2 o 3 elementos para pulir los ajustes, luego cambiamos los gerange con las celdas de destino y los "invoiceData" con el código de columna que informamos en el segundo paso.