Cómo extraer un PDF solo de las hojas con información con Google Apps Script


 Hace un tiempo un usuario me pidió en el post de Como crear un PDF de una selección de datos con Google Apps Script como se podía hacer un script que generase un PDF de las hojas que tuvieran datos.

Es decir, como implementar un Google Apps Script que ignorase las hojas vacías de un spreadsheet y generase un PDF con la información.

El código para hacer esto es bastante sencillo, de hecho, me he basado en el código que publiqué en Como generar un PDF y enviarlo por email con Google Apps Script modificando la parte en que se detecta las hojas a convertir.

El proceso para convertir un spreadsheet a PDF desde Google Apps Script, es tan sencillo como llamar a la API de exportación a través de un UrlFetchApp y con eso lo tenemos todo hecho. 

El proceso de conversión a PDF puede tardar un rato ( dependerá del tamaño de los datos ) , generalmente unas decenas de segundos.

Aquí os dejo el código:

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

function ExportPDF() 
{
   var timestamp = Math.floor((new Date()).getTime() / 1000);
   
   var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
   var sheets      = spreadsheet.getSheets();

   var values = new Array();
   for(var s = 0 ; s < sheets.length ; s++)
   {
     //Asumimos que la hoja esta "escrita" si tiene más de una fila de datos
     if ( sheets[s].getDataRange().getValues().length > 1 )
     {
        values.push(sheets[s].getName());
     }
   }
   var out         = SpreadsheetApp.create(spreadsheet.getName() + "-ToPrint-" + timestamp);
   var folder      = DriveApp.getFolderById("tu_nombre_de_Carpeta");
   
   SpreadsheetApp.flush();
   for(var i = 0 ; i < values.length ; ++i)
   {
      var sheet = spreadsheet.getSheetByName(values[i]);
      sheet.copyTo(out).setName(values[i]);
   }
   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);
}

 No vaciléis en hacerme llegar vuestras dudas ( tardaré más o menos pero siempre acabaré respondiendo )

Nos vemos

 

 

No hay comentarios:

Publicar un comentario

Tal vez te interese