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!


4 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

Tal vez te interese