Skip to content

Códigos de AppScript (1)

Código fe forms→google sheets→pdf en carpet asignada con link de la hoja de calculo del formulario + duplicado de google sheets en carpeta asignada
Con nombre de Archivo “Copia - Nombre del archivo original - fecha”
function onFormSubmit(e) {
const templateId = 'ID_DE_TU_PLANTILLA_SHEETS'; // Reemplaza con el ID de tu plantilla Sheets
const folderId = 'ID_DE_TU_CARPETA_DRIVE'; // Reemplaza con el ID de tu carpeta destino

const sheet = e.source.getActiveSheet();
const responses = e.values;
const headers = sheet.getRange(1, 1, 1, responses.length).getValues()[0];

// Mapear los datos del formulario
const data = {};
for (let i = 0; i < headers.length; i++) {
data[headers[i]] = responses[i];
}

// Obtener el nombre original de la plantilla y añadir " - copia"
const plantilla = DriveApp.getFileById(templateId);
const nombreOriginal = plantilla.getName();
const nombreArchivo = `${nombreOriginal} - ${new Date().toLocaleDateString()}`;

// Hacer una copia temporal de la plantilla (NO en la carpeta asignada)
const copia = DriveApp.getFileById(templateId).makeCopy(nombreArchivo);
const copiaId = copia.getId();
const libro = SpreadsheetApp.openById(copiaId);
const hoja = libro.getSheets()[0]; // Usa getSheetByName('NombreHoja') si es necesario

// Reemplazar campos tipo {{Campo}} en todas las celdas
const rango = hoja.getDataRange();
const valores = rango.getValues();

for (let i = 0; i < valores.length; i++) {
for (let j = 0; j < valores[i].length; j++) {
if (typeof valores[i][j] === "string") {
for (let campo in data) {
valores[i][j] = valores[i][j].replace(`{{${campo}}}`, data[campo]);
}
}
}
}

rango.setValues(valores);
SpreadsheetApp.flush(); // Fuerza el guardado de los cambios
Utilities.sleep(1000); // Espera 1 segundo para que los cambios se reflejen

// Exportar la hoja como PDF
const pdf = exportSheetAsPDF(copiaId, hoja.getSheetId(), nombreArchivo);
const archivoPDF = DriveApp.getFolderById(folderId).createFile(pdf);
archivoPDF.setName(nombreArchivo + ".pdf");

const linkPDF = archivoPDF.getUrl();

// 1. Enviar por correo si existe el campo "Correo"
if (data["Correo"]) {
MailApp.sendEmail({
to: data["Correo"],
subject: "Tu PDF ha sido generado",
body: `Gracias por completar el formulario.\nAquí tienes tu documento PDF:\n${linkPDF}`
});
}

// 2. Escribir el link del PDF en la hoja de respuestas
const fila = e.range.getRow();
const columnaLink = headers.length + 1;
sheet.getRange(fila, columnaLink).setValue(linkPDF);

// (Opcional) Eliminar la copia de Sheets temporal si no deseas guardarla
// DriveApp.getFileById(copiaId).setTrashed(true); // <- Descomenta si quieres borrar la copia
}


// Función para exportar una hoja como PDF
function exportSheetAsPDF(fileId, sheetId, nombreArchivo) {
const url = `https://docs.google.com/spreadsheets/d/${fileId}/export?` +
'format=pdf' + // formato de exportación
'&size=A4' + // tamaño del papel
'&portrait=true' + // orientación vertical
'&fitw=true' + // ajustar al ancho
'&sheetnames=false' + // no mostrar nombres de hojas
'&printtitle=false' + // no mostrar título
'&pagenumbers=false' + // no mostrar números de página
'&gridlines=false' + // no mostrar líneas de cuadrícula
'&fzr=false' + // no congelar filas
'&top_margin=0.3' + // margen superior (~1 cm)
'&bottom_margin=0.3' + // margen inferior (~1 cm)
'&left_margin=0.3' + // margen izquierdo (~1 cm)
'&right_margin=0.3' + // margen derecho (~1 cm)
'&horizontal_alignment=CENTER' + // alineación horizontal
'&vertical_alignment=TOP' + // alineación vertical
'&gid=' + sheetId; // ID de la hoja específica

const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + token
}
});

return response.getBlob().setName(nombreArchivo + '.pdf');
}


Con nombre de Archivo “Documento - sin nombre -fecha”
function onFormSubmit(e) {
const templateId = 'ID_DE_TU_PLANTILLA_SHEETS'; // Reemplaza con el ID de tu plantilla Sheets
const folderId = 'ID_DE_TU_CARPETA_DRIVE'; // Reemplaza con el ID de tu carpeta destino

const sheet = e.source.getActiveSheet();
const responses = e.values;
const headers = sheet.getRange(1, 1, 1, responses.length).getValues()[0];

// Mapear los datos del formulario
const data = {};
for (let i = 0; i < headers.length; i++) {
data[headers[i]] = responses[i];
}

const nombreArchivo = `Documento - ${data["Nombre"] || "SinNombre"} - ${new Date().toLocaleDateString()}`;
// Hacer una copia temporal de la plantilla (NO en la carpeta asignada)
const copia = DriveApp.getFileById(templateId).makeCopy(nombreArchivo);
const copiaId = copia.getId();
const libro = SpreadsheetApp.openById(copiaId);
const hoja = libro.getSheets()[0]; // Usa getSheetByName('NombreHoja') si es necesario

// Reemplazar campos tipo {{Campo}} en todas las celdas
const rango = hoja.getDataRange();
const valores = rango.getValues();

for (let i = 0; i < valores.length; i++) {
for (let j = 0; j < valores[i].length; j++) {
if (typeof valores[i][j] === "string") {
for (let campo in data) {
valores[i][j] = valores[i][j].replace(`{{${campo}}}`, data[campo]);
}
}
}
}

rango.setValues(valores);
SpreadsheetApp.flush(); // Fuerza el guardado de los cambios
Utilities.sleep(1000); // Espera 1 segundo para que los cambios se reflejen

// Exportar la hoja como PDF
const pdf = exportSheetAsPDF(copiaId, hoja.getSheetId(), nombreArchivo);
const archivoPDF = DriveApp.getFolderById(folderId).createFile(pdf);
archivoPDF.setName(nombreArchivo + ".pdf");

const linkPDF = archivoPDF.getUrl();

// 1. Enviar por correo si existe el campo "Correo"
if (data["Correo"]) {
MailApp.sendEmail({
to: data["Correo"],
subject: "Tu PDF ha sido generado",
body: `Gracias por completar el formulario.\nAquí tienes tu documento PDF:\n${linkPDF}`
});
}

// 2. Escribir el link del PDF en la hoja de respuestas
const fila = e.range.getRow();
const columnaLink = headers.length + 1;
sheet.getRange(fila, columnaLink).setValue(linkPDF);

// (Opcional) Eliminar la copia de Sheets temporal si no deseas guardarla
// DriveApp.getFileById(copiaId).setTrashed(true); // <- Descomenta si quieres borrar la copia
}


// Función para exportar una hoja como PDF
function exportSheetAsPDF(fileId, sheetId, nombreArchivo) {
const url = `https://docs.google.com/spreadsheets/d/${fileId}/export?` +
'format=pdf' + // formato de exportación
'&size=A4' + // tamaño del papel
'&portrait=true' + // orientación vertical
'&fitw=true' + // ajustar al ancho
'&sheetnames=false' + // no mostrar nombres de hojas
'&printtitle=false' + // no mostrar título
'&pagenumbers=false' + // no mostrar números de página
'&gridlines=false' + // no mostrar líneas de cuadrícula
'&fzr=false' + // no congelar filas
'&top_margin=0.3' + // margen superior (~1 cm)
'&bottom_margin=0.3' + // margen inferior (~1 cm)
'&left_margin=0.3' + // margen izquierdo (~1 cm)
'&right_margin=0.3' + // margen derecho (~1 cm)
'&horizontal_alignment=CENTER' + // alineación horizontal
'&vertical_alignment=TOP' + // alineación vertical
'&gid=' + sheetId; // ID de la hoja específica

const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + token
}
});

return response.getBlob().setName(nombreArchivo + '.pdf');
}

Código para generar Botones de Duplicado y Exportar PDF a carpeta especifica
Iniciador de los Botones
Colocar en OnOpen
function onOpen() {
initMenu1(); // Llama al menú del primer script
initMenu2(); // Llama al menú del segundo script
}
Codigo de Duplicado de Google Sheets a Carpeta Especifica
Colocar en initMenu1
/**
* Función para agregar el menú personalizado
*/
function initMenu1() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Duplicar')
.addItem('Duplicar documento', 'duplicarSheetACarpeta')
.addToUi();
}
/**
* Función para duplicar la hoja actual a una carpeta específica
* @return {string} El URL de la nueva copia creada
*/
function duplicarSheetACarpeta() {
// Obtener la hoja actual
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var nombreOriginal = spreadsheet.getName();
// Configuración: ID de la carpeta destino (reemplaza con tu ID)
var idCarpetaDestino = 'COLOCAR ID DE LA CARPETA DE DRIVE';
var carpetaDestino = DriveApp.getFolderById(idCarpetaDestino);
// Crear copia en la carpeta destino
var fecha = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd_HH-mm');
var nuevoNombre = nombreOriginal + ' - Copia ' + fecha;
var nuevaCopia = DriveApp.getFileById(spreadsheet.getId()).makeCopy(nuevoNombre, carpetaDestino);
// Obtener el URL de la nueva copia
var urlNuevaCopia = nuevaCopia.getUrl();
// Mostrar mensaje con el enlace
var ui = SpreadsheetApp.getUi();
var respuesta = ui.alert(
'Copia creada exitosamente',
'Se ha creado una copia en la carpeta destino.\n¿Deseas abrir la nueva copia?',
ui.ButtonSet.YES_NO
);
if (respuesta == ui.Button.YES) {
// Abrir la nueva hoja en una pestaña nueva
var htmlOutput = HtmlService
.createHtmlOutput('<script>window.open("' + urlNuevaCopia + '");google.script.host.close();</script>')
.setWidth(50)
.setHeight(50);
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.