Como generar un PDF de hojas seleccionadas con Google Apps Script


 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:
Como seleccionar pestañas a convertir a pdf y folder donde poner los resultados con Google Apps Script



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!


10 comentarios:

  1. Hola, no consigo que me guarde. Me puedes ayudar.
    Exactamente no sé como indicar la pagina que quiero que me guarde como PDF.

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
  2. HOla, 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.

    ResponderEliminar
    Respuestas
    1. Los 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
      Cualquier cosa, házmelo saber
      Nos vemos

      Eliminar
    2. Hola gracias por tu blog, me esta siendo muy util.
      Tengo el mismo problema, donde tengo que poner getDisplayValues, porque cmabiandolo por getValues no me funciona.

      Eliminar
  3. 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!

    ResponderEliminar
  4. Buenos dias

    Tengo 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.

    ResponderEliminar
    Respuestas
    1. Solucionado! No hay que poner el nombre de la carpeta en la hoja de cálculo, sino su ID.

      Gracias y disculpen!

      Eliminar
    2. No hay problema. Me alegro que te funcione!
      Nos vemos!

      Eliminar
  5. 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

Tal vez te interese