Lista a tabs
Transformación de Lista a Documentos Individuales en Google Sheets
En ocasiones
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
-
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. -
Diseñar una Plantilla de Documento: En otra
conpestaña, elabora una plantilla del documento quequeremosdeseasygenerar.unAsegúratescriptdequenumerar adecuadamente cada campo relevante en la cabecera, esto servirá más adelante para mapear losrecorradatosgenerando las nuevas pestañas rellenas.correctamente. -
EnVisualizarla cabecera numeramosEjemplos de lasiguienteConfiguración:forma,Observa los siguientes ejemplos visuales para tener unabuenaideareferencia,claraluegodeveremoscómoparaestructurarquetushacemospestañasesto.de lista y plantilla.- Configuración de la Lista:
La
- Ejemplo
seriadealgoPlantilla:
Implementación del Script
EntoncesPara nosiniciar vamosel a:proceso "Extensions-de generación automática de documentos:
- Dirígete a
Extensiones > App.Script"Script - En el entorno de App Script, prepara y ejecuta el siguiente código:
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:
- Pruebas
cambiarIniciales: Para las primeras ejecuciones, limita ellímitebucledel for,forparaqueprocesarrecorrersolo 2 o 3elementosfilas.paraEstopulirfacilita ajustar losajustes,mapeos - Refactorización:
cambiamosdesaconsejo refactorizar al estar claros losgerange con las celdas de destinobloques ylosser"invoiceData" con el código de columna que informamospersonalizados enelcadasegundouso



