with script mail google gmailapp from apps app google-apps-script

from - google apps script y GmailApp: recibe solo mensajes nuevos



mail app google script (5)

Estoy tratando de implementar un simple script de google que procesa cada mensaje que recibe un usuario de gmail.
Encontré un ejemplo que hace algo como esto:

var threads = GmailApp.getInboxThreads(); for (var i=0; i < threads.length; i++) { var messages = threads[i].getMessages(); for (var j=0; j < messages.length; j++) { if (!messages[j].isUnread()) { continue; } //process message } }

Es decir: repito todos los mensajes en la bandeja de entrada y busco los no leídos. Esto es muy lento con solo 1800 mensajes.
Idealmente, estoy buscando un disparador que se active una vez que se reciba cada nuevo mensaje.
Si no existe tal cosa, trataría de hacer uso de esto que vi:

GmailApp.getMessageById(id)


Lamentablemente, no hay un disparador que dispara para cada mensaje recibido. Sin embargo, hay una buena solución:

Configure una regla de filtro que asigne una etiqueta especial, "ToBeProcessedByScript" como ejemplo, a todos los mensajes entrantes. Dado que los comodines no funcionan realmente en los filtros de Gmail, use el campo para:

Ejecute una secuencia de comandos activada por tiempo que recolecte todos los hilos de mensajes nuevos con GmailApp.getUserLabelByName("ToBeProcessedByScript").getThreads() . Elimine la etiqueta especial justo antes de procesar los mensajes nuevos.


puedes usar

GmailApp.getInboxThreads(0, 50);

para inicializar la variable con los primeros cincuenta correos.


Perdón por la respuesta tardía, pero tuve el mismo tipo de problema y terminé usando GmailApp.search () ... espero que esto ayude.

// find unread messages var threads = GmailApp.search(''is:unread''); ....

ADVERTENCIA

Esta llamada fallará cuando el tamaño de todos los hilos sea demasiado grande para que lo maneje el sistema. Cuando el tamaño del hilo sea desconocido, y potencialmente muy grande, utilice la llamada ''paginada'' y especifique los rangos de los hilos para recuperar en cada llamada.

Eche un vistazo a GmailApp.search (query) y GmailApp.search (query, start, max)


Puede crear un disparador de tiempo como djtek mencionado, pero en lugar de etiquetar todos los mensajes y luego recuperar los mensajes etiquetados, puede obtener el número de mensajes no leídos y recuperar los hilos de 0 a la cantidad de mensajes no leídos, siguiendo un código que funcione para mi:

function getUnreadMails() { var ureadMsgsCount = GmailApp.getInboxUnreadCount() if(ureadMsgsCount>0) { var threads = GmailApp.getInboxThreads(0, ureadMsgsCount); for(var i=0; i<threads.length; i++) { if(threads[i].isInInbox()) { var messages = threads[i].getMessages(); for(var j=0; j<messages.length; j++) { Logger.log(messages[j].getSubject()); // process unread message } } } } }


He extendido el código para verificar si el primer mensaje es realmente el que no se ha leído. Si no es así, comprobará el siguiente mensaje y continuará hasta que encuentre el mensaje no leído:

function getUnreadMails() { var ureadMsgsCount = GmailApp.getInboxUnreadCount(); var threads; var messages; var k=1; if(ureadMsgsCount>0) { threads = GmailApp.getInboxThreads(0, ureadMsgsCount); for(var i=0; i<threads.length; i++) { if(threads[i].isInInbox()) { messages = threads[i].getMessages(); for(var j=0; j<messages.length; j++) { while (messages[j].isUnread() === false) { threads=GmailApp.getInboxThreads(k, ureadMsgsCount); messages = threads[i].getMessages(); k++; } Logger.log(messages[j].getSubject()); // process unread message } } } } }