Ya he hecho algún que otro post hablando de exportar a PDF y más uno me ha pedido como hacer un script que permita seleccionar que hojas queremos exportar con Google Apps Script
La única manera que hay (o al menos que yo he encontrado :) ) es copiar todas las hojas a un documento limpio y exportar a PDF todo el documento generado. El código es bastante sencillo:
function ExportPDF() { var timestamp = Math.floor((new Date()).getTime() / 1000); var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var values = spreadsheet.getSheetByName("ToPrint").getDataRange().getValues(); var out = SpreadsheetApp.create(spreadsheet.getName() + "-ToPrint-" + timestamp); var folder = DriveApp.getFolderById(values[1][1]); SpreadsheetApp.flush(); for(var i = 1 ; i < values.length ; ++i) { var tab = values[i][0]; var sheet = spreadsheet.getSheetByName(tab); if(sheet == null || sheet == undefined) { SpreadsheetApp.getUi().alert("Unknown tab:" + tab); return; } sheet.copyTo(out).setName(sheet.getName()); } var first_sheet = out.getSheets()[0]; out.deleteSheet(first_sheet); SpreadsheetApp.flush(); var exportUrl = 'https://docs.google.com/spreadsheets/d/' + out.getId() + '/export?exportFormat=pdf&format=pdf' + '&size=FOLIO' //Tamaño del papel: 0-LETTER,1-TABLOID,2-LEGAL,3-STATEMENT,4-EXECUTIVE,5-FOLIO,6-A3,7-A4,8-A5,9-B4,10-B5 + '&portrait=false' //Orientación: False - Horizontal / True - Vertical + '&fitw=true' //Forzamos que quepa correctamente en el ancho de la hoja + '&scale=4' // Fit to Page? + '&top_margin=1.75' //Margen Superior + '&bottom_margin=1.75' //Margen inferior + '&left_margin=1.5' //Margen Izquierdo + '&right_margin=1.5' //Margen Derecho + '&sheetnames=false' //Marcamos si se ha de poner el nombre de las hojas o no + '&printtitle=false' //Marcamos si se ha imprimir el titulo del documento o no + '&pagenum=false' //Indicamos si se de pintar el número de página + '&gridlines=true' //Marcamos si queremos que se vean las lineas de las celdas o no + '&fzr=FALSE' //Frozen: marcamos si las cabeceras se han de ir imprimiendo o no en las consecutivas hojas + '&id=' + out.getId(); //Identificador del tab var response = UrlFetchApp.fetch(exportUrl, { muteHttpExceptions: true, headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() } } ); var blob = response.getBlob(); blob = blob.setName(out.getName()); var pdfFile = DriveApp.createFile(blob); pdfFile.moveTo(folder); SpreadsheetApp.getUi().alert(pdfFile.getUrl()); DriveApp.getFileById(out.getId()).setTrashed(true); }
Si os fijais en el código se basa para funcionar en que tengáis un tab que se llame ToPrint que contendrá la lista de hojas a exportar y la carpeta donde queremos tener los PDFs generados.
La pestaña ToPrint se verá de esta manera:
El script se encarga de generar un nuevo spreadsheet, copiar las hojas que nos interesan y generar un PDF de todo el spreadsheet con google apps script
Espero que os haya servido, no vaciléis en hacerme llegar vuestras dudas
Nos vemos
NOTA: He hecho una versión mejorada que permite enviar PDFs por email con Google Apps Script, tal vez también te interesa!
Hola, no consigo que me guarde. Me puedes ayudar.
ResponderEliminarExactamente no sé como indicar la pagina que quiero que me guarde como PDF.
Siento haber tardado en la respuesta, este comentario se me coló: "Si os fijais en el código se basa para funcionar en que tengáis un tab que se llame ToPrint que contendrá la lista de hojas a exportar y la carpeta donde queremos tener los PDFs generados." Creo que está claro, de no ser así, hazmelo saber
EliminarHOla, estoy haciendo pruebas con tu Script, pero al generar las hojas que necesito en pdf, me arroja el contenido de las celdas con REF, no carga los datos, siendo que los datos a llenar en esas celdas esta linkeado en el mismo libro, que podra ser?, los permisos estan habilitados, te agradeceria una ayuda.
ResponderEliminarLos datos estan referenciados, has de usar el getDisplayValues en vez de getValues. Este articulo tal vez te lo explique un poco mejor: https://www.tutorialesgoogleappscripts.com/2020/11/diferencias-entre-getvalues-y-getdisplayvalues-con-google-apps-script.html
EliminarCualquier cosa, házmelo saber
Nos vemos
Hola gracias por tu blog, me esta siendo muy util.
EliminarTengo el mismo problema, donde tengo que poner getDisplayValues, porque cmabiandolo por getValues no me funciona.
Buenos días. Estoy probando scripts pero ninguno se acerca a lo que estoy buscando, y no me conozco los comandos para lograr lo que necesito. Concretamente necesito uno que al seleccionar-lo desde un menú, imprima en un mismo pdf el contenido de varias pestanyas de mi Excel. Después también me gustaría poder hacer otra funcionalidad, y es que desde otro menú, me extraiga el contenido de una pestaña en concreto en formato .csv. He conseguido crear los menús i que imprima todo el documento, pero hojas en concreto directamente desde menú, no. Si me pudierais echar una mano sería genial. Muchas gracias!
ResponderEliminarBuenos dias
ResponderEliminarTengo problema con el FolderById, no coge el valor del Values[1][1]. El valor del campo de la hoja de cálculo es el nombre de la carpeta? Por ejemplo "Mi unidad". En el ejemplo de arriba se ve borrado el valor del campo Folder y es donde me da error.
Muchas gracias.
Solucionado! No hay que poner el nombre de la carpeta en la hoja de cálculo, sino su ID.
EliminarGracias y disculpen!
No hay problema. Me alegro que te funcione!
EliminarNos vemos!
Hola, me gustaria saber como podria hacer lo mismo pero poner un condicional para que ciertas hojas se añadan o se excluyan si el resultado de una celda en concreto es ="SI" o es ="NO"
ResponderEliminar