Cómo leer mensajes de Gmail desde Google Apps Script

Artículo perteneciente a la gestión de gmail desde Google Apps Script
Este artículo se ha usado para el proyecto : Organizador de emails

A veces nos puede resultar útil que un script pueda leer nuestros correos para organizarlos, recopilar información o filtrarlos.

Como casi siempre que trabajamos con GAS, es más fácil implementarlo de lo que podría parecer en un principio.

Con estas pocas lineas del ejemplo, ejecutadas desde una hoja de cálculo, podréis ver los resultados.

function LeerEmail()
{
  var emails = GmailApp.getInboxThreads();

  var string = "";

  for(var e = 0 ; e < emails.length ; ++e )
  {
     string += emails[e].getFirstMessageSubject() + "\n";
  }
  SpreadsheetApp.getUi().alert(string);
}

El resultado que aparecerá será algo de este estilo:

Espero que os sirva para vuestros proyectos

24 comentarios:

  1. ¿Cómo podría obtener solamente los mensajes que están etiquetados con determinada etiqueta?

    ResponderEliminar
  2. No lo he probado, pero debería funcionarte esto:

    function LeerEmail()
    {
    var emails = GmailApp.getInboxThreads();

    var string = "";

    for(var e = 0 ; e < emails.length ; ++e )
    {
    var labels = emails[e].getLabels();
    for(var l = 0 ; l < labels.length ; ++l )
    {
    if ( labels[l].getName() == "Trabajo" )
    {
    string += emails[e].getFirstMessageSubject() + "\n";
    }
    }
    }
    SpreadsheetApp.getUi().alert(string);
    }

    Evidentemente donde pone "Trabajo" pon la etiqueta que tu necesites.

    Ya me contaras como te ha ido

    ResponderEliminar
  3. Buenos días, como seria un script para extraer información de un correo y exportar el cuerpo del mensaje en un excel??

    ResponderEliminar
    Respuestas
    1. Lo mismo que tienes en este post pero:
      1. Deberias seleccionar que correo quieres extraer (emails[x])
      2. Dentro de ese correo deberias obtener todos los mensajes de la conversación con getMessages()
      3. Deberias seleccionar cual de esos mensajes es el que quieres [y]
      4. Deberias obtener el cuerpo del mensaje en cuestión con getPlainBody().

      Resumiendo, si quisieras obtener el cuerpo del primer mensaje de tu bandeja de entrada deberias hacer algo de este estilo:
      emails[0].getMessages()[0].getPlainBody()

      Para poner esa información en un excel ( hoja de calculo de google, mejor :) ) te remito al tutorial en concreto: http://googleappscriptsweb.blogspot.com.es/2015/02/como-escribir-en-una-celda-de-una-hoja.html

      Espero q te sirva

      Nos vemos

      Eliminar
  4. ¡Hola?, muchas gracias por el código, funciona a la perfeccion... duda, y si tengo un correo delegado? como puedo obtener esos correos? el correo delegado lo obtenego con la siguiente funcion GmailApp.getAliases(), pero no encuentro como obtener los mails.

    Gracias


    ResponderEliminar
    Respuestas
    1. Te tengo que decir que nunca me lo había planteado. No te puedo responder por que es de esas pocas ocasiones que no se si tiene solución lo que preguntas. Conociendo la política de permisos de google dudo mucho que permitan ejecutar este tipo de scripts en correos delegados, aunque no me atrevo a asegurarlo. Siento no poder ser de más ayuda. Tal vez en stackoverflow puedan darte más información.

      Eliminar
    2. no te preocupes, muchas gracias por responder.

      Llevo un buen rato analizando los objetos y ningún metodo me lo da.

      Saludos

      Eliminar
  5. Este tema me genero una perdida de tiempo que no tenia previsto, debido a una que me entregaron un ASA ya configurado y tuve que investigar como realizar un recuperar contraseña facebooka este equipo, y todos los post que conseguí eran en ingles, y quisiera dejarles un articulo resumido en español de la información que es fidedigna, ya que la probé en mi propio equipo

    ResponderEliminar
  6. Pako la duda sonora bien nada que ver, pero donde empiezo a codear? por ejemplo que una hoja de google esta en herramientas, pero si quiero manejar mi gmail donde deberia poner el codigo?

    ResponderEliminar
    Respuestas
    1. Yo siempre hago el codigo para gmail dentro de una hoja de calculo.

      Piensa que el código se ejecuta en la nube el donde resida el script (Casi) no afecta.

      Espero q te sirva

      Nos vemos

      Eliminar
  7. como puedo obtener solo un correo con un id especificado?

    ResponderEliminar
    Respuestas
    1. Yo te diria que seleccionando el titulo del mensaje. Es lo mas usual.

      Nos vemos

      Eliminar
  8. Hola,

    Como puedo hacer si tengo una lista de direcciones de correos en google sheets y si alguno de estos envian un correo electronico se dirigan a una etiqueta especifica.

    Desde ya gracias por tu apoyo.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola,

      Me encanta ayudaros cuando teneis alguna duda de programación pero cuando me pedís que os haga un proyecto solo puedo dirigiros a mi cuenta de Fiverr.

      En la columna de la derecha-arriba en esta web verás el link a mi cuenta de Fiverr.

      Si lo intentas y te quedas atascado en algun momento hazmelo saber y te ayudaré gratis , si quieres los servicios de un programador algo costará :) (por lo que pides, no debería ser mucho)

      Nos vemos!

      Eliminar
  9. Hola buenas tardes, soy pasante en una ONG y me pidieron sistematizar su correo, para ser específicos solo los correos que tengan por 'subject' "suscriptor" y dentro de ese correo viene el correo del suscriptor, el cual lo tengo que pasar a un archivo Excel, pero yo en verdad no sé nada de eso, no sé si me puedas ayudar y si tiene un costo les comentaría a mis líderes. Gracias de antemano.

    ResponderEliminar
  10. Si tu correo es de gmail y los datos los quieres en una hoja de google puedo hacerlo.

    No obstante, cuando alguien me pide que le haga un script tengo la mala costumbre de cobrarlo :)

    Tienes dos opciones:
    - Puedes ponerte en contacto conmigo en esta dirección a fin de que podamos ver como facturartelo: software.developer.bordas@gmail.com
    - Si lo prefieres podemos hacer el proyecto via Fiverr: http://www.fiverr.com/s2/bbb67c5713

    Ya me diras que opción te va mejor

    Nos vemos

    ResponderEliminar
  11. Como puedo obtener los correos de los remitentes??

    ResponderEliminar
    Respuestas
    1. Hola , Con getFrom del mensaje.

      Creo que con esto conseguirias lo que quieres

      var threads = GmailApp.getInboxThreads();
      var messages = threads[0].getMessages();
      var senderEmail = messages[0].getFrom();

      Ya me diras como te va

      Nos vemos

      Eliminar
  12. Muchas gracias, ya lo tengo, el problema ahora es que me limita los resultados a no más de 700, no entiendo porque, tendra alguna restricción?, mi codigo es el siguiente:

    function SearchGmail3() {

    var sheet = SpreadsheetApp.getActiveSheet();
    var row = 2;

    // Clear existing search results
    sheet.getRange(2, 1, sheet.getMaxRows() - 1, 4).clearContent();

    // Which Gmail Label should be searched?
    var label = "inbox";

    // Get the Regular Expression Search Pattern
    var pattern = sheet.getRange("F4").getValue();

    // Retrieve all threads of the specified label
    var threads = GmailApp.search("in:" + label);

    for (var i = 0; i < threads.length; i++) {

    var messages = threads[i].getMessages();

    for (var m = 0; m < messages.length; m++) {
    var msg = messages[m].getBody();

    // Does the message content match the search pattern?
    if (msg.search(pattern) !== -1) {

    // Format and print the date of the matching message
    sheet.getRange(row,1).setValue(
    Utilities.formatDate(messages[m].getDate(),"GMT","yyyy-MM-dd"));

    // Print the sender's name and email address
    sheet.getRange(row,2).setValue(messages[m].getFrom());

    // Print the message subject
    sheet.getRange(row,3).setValue(messages[m].getSubject());

    // Print the unique URL of the Gmail message
    var id = "https://mail.google.com/mail/u/0/#all/"
    + messages[m].getId();
    sheet.getRange(row,4).setFormula(
    '=hyperlink("' + id + '", "View")');

    // Move to the next row
    row++;
    }
    }
    }
    }

    ResponderEliminar
  13. Simplemente eres lo máximo. Soy autodidacta y estoy aprendiendo mucho. Que Dios te bendiga.

    ResponderEliminar
    Respuestas
    1. Para eso está el blog. Si no sirviera para algo, no lo escribiría.

      No vaciles en hacerme llegar tus dudas

      Nos vemos

      Eliminar
  14. Agradezco el tiempo que tomas para subir este contenido. Tengo una duda, en la cuenta de correo que se tiene se van a recibir solamente correos con notificaciones de una plataforma, el remitente siempre será el mismo y el tipo de respuesta será igual pues es una plantilla que tiene exactamente la misma información. Lo que cambia en cada correo es una liga que está ubicada siempre en la misma posición que llega en cada correo ¿es posible extraer ese único texto de entre todo el contenido?. Muchas gracias.

    ResponderEliminar
  15. Hola Lord Pakus, gracias por este contenido, disculpa ¿cómo puedo traer del cuerpo del correo únicamente una cadena de valores específica que es una liga?, ya que con getBodyPlainText() trae todo el mensaje completo, ¿Se puede? De antemano te agradezco mucho tu tiempo.

    ResponderEliminar

Tal vez te interese