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.
En la cabecera numeramos de la siguiente forma, para tener una buena referencia, luego veremos para que hacemos esto.
La plantilla seria algo asi:
Entonces nos vamos a: "Extensions->App Script"
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.



