Como generar un PDF y enviarlo por email con Google Apps Script


 Hace un tiempo expliqué como generar un PDF de ciertas hojas seleccionadas con Google Apps Script. También os expliqué anteriormente como enviar un email con Google Apps Script.

Un lector del blog me ha comentado aquí  como podríamos unir ambas cosas y realmente me parece una idea fantástica!

Es bastante más fácil de lo que parece, aunque implica algo de código:

function onOpen()
{
   SpreadsheetApp.getUi().createMenu("SCRIPT")
                   .addItem("Print", "ExportPDF")
                   .addItem("Send", "SendPDF")
                   .addToUi();
}

function SendPDF()
{
  var sheet   = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ToPrint");
  var email   = sheet.getRange("C2").getValue();
  var pdfFile = GeneratePDF();
  MailApp.sendEmail(email, 'Ejemplo de como enviar un PDF', 'Ahi tienes el PDF', {
     name: 'El script más util del mundo :D ',
     attachments: [pdfFile.getAs(MimeType.PDF)]
 });
}

function ExportPDF()
{
   var pdfFile = GeneratePDF();
   SpreadsheetApp.getUi().alert(pdfFile.getUrl());
}

function GeneratePDF() 
{
   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()).getDataRange().setFontColor("black");
   }
   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);
    
  //Erase the temp spreadsheet
  DriveApp.getFileById(out.getId()).setTrashed(true);
  
  return pdfFile;
}

Básicamente he modificado el código de generación de PDF para que me devuelva el fichero y lo pueda enviar como adjunto en el email. 

Si lo miráis con detenimiento veréis que no es complicado.

El email donde se enviaran los documentos esta en la misma hoja de ToPrint que usamos para decir que tabs usaremos en la generación del PDF.

como enviar pdf como adjunto con google apps script

Creo que el código es fácil de entender, pero no dudéis en hacerme llegar vuestras sugerencias.

Nos vemos!




3 comentarios:

  1. Holaa, esto es justo lo que he estado buscando en varios videos y nadie explica! Al ejecutar el código me aparece un error al obtener el método o la propiedad getFolderById en el objeto DriveApp, alguien sabe como resolver esto? Gracias!

    ResponderEliminar
    Respuestas
    1. Me alegro que te sirva! Generalmente si el getFolderById no funciona es o bien por que no has puesto bien el Id, o bien por que no existe o bien por que no tienes permisos. Copia si quieres la linea que estas usando y la reviso

      Eliminar
    2. Oh sería genial si puedes echarle un vistazo!! Este es el link del documento https://docs.google.com/spreadsheets/d/1e_uhHmvZiXxirMqaLLkNkxwRUTAX_3CuBRi1FRnasNA/edit?usp=sharing

      muchas gracias!!

      Eliminar

Tal vez te interese