Implementación de organizador de emails dentro de Drive mediante Google Apps Script

Esta implementación resuelve la propuesta de proyecto hecha originalmente por Bruno Carvalho

No hace mucho , un lector del blog ( Bruno ) nos propuso un proyecto interesante. Que hiciéramos un script de google apps que leyera ciertos correos y los grabara como pdfs dentro de drive, organizados por fecha.

Aquí tenéis todo el código que hace lo que se pide.

function onOpen()
{
  var ui = SpreadsheetApp.getUi();
  var rrhh = ui.createMenu('Organizador de emails')
                  .addItem('Work', 'EmailOrganizer')
                  .addToUi();
}

function NextRow(sheet,id)
{
  var cont = 1;
  while(true)
  {
    var range = sheet.getRange(cont,2);
   
    if(range.isBlank())
       return cont;
   
    if( range.getValue() == id )
      return 0;
   
    cont++;
  }
}

function CreateLog(project,email)
{
   var spread = SpreadsheetApp.create("temp");
   var sheet = spread.getActiveSheet();
 
   var messages = email.getMessages();
 
   for( var m = 0 ; m < messages.length ; m++ )
   {
      var message = messages[m];
      sheet.getRange(m+1, 1).setValue(message.getBody());
      var attachments = message.getAttachments();
      for( var a = 0 ; a < attachments.length ; a++ )
      {
        var attachment = attachments[a];
        sheet.getRange(m+1, a+2).setValue(attachment.getDataAsString());
      }
   }
   sheet.autoResizeColumn(1);  
  var other = spread.copy("other"); //Hacemos una copia del fichero solo para que forzar a que se asiente la información. Sino ,no le da a tiempo a actualizar la info antes de crear el pdf
  var newFile = DriveApp.createFile( spread.getAs('application/pdf'));
  newFile.setName(email.getLastMessageDate());
 
   DriveApp.getFileById(spread.getId()).setTrashed(true);
  DriveApp.getFileById(other.getId()).setTrashed(true);
   newFile.makeCopy(project);
   newFile.setTrashed(true);
 
}

function EmailOrganizer ()
{
   var emails   = GmailApp.getInboxThreads();
   var sheets   = SpreadsheetApp.getActiveSpreadsheet().getSheets();
   var folders  = DriveApp.getFoldersByName("ProjectOrganizer");
   var folder   = null;
   var project  = null;
 
   if ( folders.hasNext() )
   {
      folder = folders.next();  
   }
   else
   {
     folder = DriveApp.createFolder("ProjectOrganizer");
   }
 
   for (var s = 0 ; s < sheets.length ; ++s)
   {
     var sheet = sheets[s];
     var projects = folder.getFoldersByName(sheet.getName());
     if ( projects.hasNext() )
     {
        project = projects.next();  
     }
     else
     {
        project = folder.createFolder(sheet.getName());
     }
 
     for(var e = 0 ; e < emails.length ; ++e )
     {
       var email = emails[e];
       var labels = email.getLabels();
       for(var l = 0 ; l < labels.length; ++l)
       {
          if ( labels[l].getName() == sheet.getName() )
          {
            var row = NextRow(sheet,email.getId());
           
            if(row)
            {
                CreateLog(project,email);
                sheet.getRange(row,1).setValue(email.getFirstMessageSubject());
                sheet.getRange(row,2).setValue(email.getId());
            }
          }
       }
     }
   }
  }

Si quereis que se ejecute automáticamente podeis hacerlo con lo que explicamos en el tutorial de automatización de tareas

Se os ocurren maneras de mejorarlo? Queréis hacer propuestas?

Os espero

No hay comentarios:

Publicar un comentario en la entrada

Related Posts Plugin for WordPress, Blogger...