Organizador de emails en Drive con 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

2 comentarios:

  1. Hola:

    Agradecería me ayudasen a hacer un código a través del Editor de secuencias de comando para que cada vez que se rellene un formulario de google en función de las respuestas elegidas se envíe un tipo un otro de mensaje a la dirección de correo de la persona que lo rellene c/c a otras direcciones o lo que se estime conveniente.


    Ej:
    Ej: si el formulario sólo tiene 3 preguntas

    Pregunta0_email: -.....@gmail.com
    Pregunta1_¿cuántos años tienes?:
    elegir entre 0-17 o 18-25 o más de 25
    Pregunta2_lugar de nacimiento:
    elegir entre: España, Francia y Alemania



    Arbol decisión para respuesta automática:

    si responde entre 18 - 25 y España

    mensaje adicional automático: "Debe enviarlo a Dpto.1"

    si responde entre 18 - 25 y diferente a España

    mensaje adicional automático: "Debe enviarlo a Dpto.2"

    si responde diferente a 18 -25 y España

    mensaje adicional automático: "Debe enviarlo a Dpto.3"

    en otro caso que se envíe un mensaje similar, si bien con el texto: "En breve atenderemos su solicitud"

    Ej: si responde de 18-25 y España

    Respuesta_automática:

    Hola:

    Datos recibidos de su solicitud:

    Pregunta0_email: -.....@gmail.com
    Pregunta1_¿cuántos años tienes?: 18-25
    Pregunta2_lugar de nacimiento: España

    Le comunicamos que:

    Debe enviarlo a Dpto.1

    Gracias.
    Saludos.

    *********************************************
    Ej: si responde de más de 25 y Alemania sería En breve atenderemos su solicitud"



    Respuesta_automática:
    Hola:

    Datos recibidos de su solicitud:

    Pregunta0_email: -.....@gmail.com
    Pregunta1_¿cuántos años tienes?: más de 25
    Pregunta2_lugar de nacimiento: Alemania

    Le comunicamos que:

    En breve atenderemos su solicitud"

    Gracias.
    Saludos.
    *********************

    Y en la hoja de respuestas que en la columna D se incluya automáticamente el texto de la Respuesta automática que hemos definido en el árbol de decisión

    [0]Columna A: Pregunta0_email |
    [1]Columna B: Pregunta1_¿cuántos años tienes? |
    [2]Columna C: Pregunta2_lugar de nacimiento |
    [3]Columna D: RESPUESTA_AUTOMÁTICA


    Quisiera que cada vez que se quiera incluir una nueva pregunta al formulario o añadir nuevas opciones de respuesta a preguntas ya existentes y se tuviese que decidir sobre qué respuestas automáticas enviar en su caso según la respuesta elegida el código fuese tal que no tuviese que apenas modificarse y, en su caso, contar con una hoja adicional donde pudiesen grabarse los casos de pregunta y respuesta a los que asignar un modelo u otro de respuesta (texto) a incluir dentro del cuerpo del correo.


    ResponderEliminar
    Respuestas
    1. Hola,

      Tardaré un tiempo a tener el suficiente tiempo para hacer un post que resuelva tu duda ( aunque es muy interesante).

      Si te corre prisa tal vez puedo hacertelo como un proyecto en Fiverr: http://www.fiverr.com/s2/bbb67c5713

      Si te interesa, ponte en contacto ahí y busco la manera más economica de resolvertelo.

      Nos vemos!

      Eliminar

Tal vez te interese