from - Google Apps Script Class GmailApp Batch Operations?
mail app google script (1)
Creo que estás buscando GmailApp.getMessagesForThreads ().
function fetchEmails(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var threads = GmailApp.search(''label:searchedLabel'');
var messages = new Array();
function Email(message){
this.date = new Date(message.getDate());
this.body = message.getBody();
}
var gmailMessages = GmailApp.getMessagesForThreads(threads);
for(var i=0;i<thread.length;i++){
var messagesForThread = gmailMessages[i];
for(var j=0;j<messagesForThread.length;j++){
if(messagesForThread[j].getFrom()=="firstName lastName <[email protected]>"){
var message = new Email(messagesForThread[j]);
messages.push(message);
}
}
}
}
Por supuesto, también puede escribir esto de forma un poco más concisa (lo siento, no puedo dar la oportunidad de educar sobre las maravillas de JavaScript):
function fetchEmails(){
var messages = Array.prototype.concat.apply([], GmailApp.getMessagesForThreads(
GmailApp.search(''label:searchedLabel'')).map(function(messagesForThread) {
return messagesForThread.filter(function(message) {
return message.getFrom() == "firstName lastName <[email protected]>";
}).map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});}));
}
Esto hace un total de 2 llamadas a Gmail, por lo que será rápido.
De hecho, si integra la parte ''de'' en la búsqueda como se sugirió anteriormente, todo lo que necesita es:
function fetchEmails(){
var messages = Array.prototype.concat.apply([], GmailApp.getMessagesForThreads(
GmailApp.search(''label:searchedLabel from:[email protected]'')).map(
function(messagesForThread) {
return messagesForThread.map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});}));
}
Finalmente, como a usted realmente no le importa la estructura del hilo, puede concaturar las matrices antes del mapa, lo que conduce a esto:
function fetchEmails(){
var messages = GmailApp.getMessagesForThreads(
GmailApp.search(''label:searchedLabel from:[email protected]''))
.reduce(function(a, b){ return a.concat(b); })
.map(function(message) {
return { date: new Date(message.getDate()), body: message.getBody() };
});
}
(Lo dejé en las muestras anteriores en caso de que realmente te importe la estructura del hilo y estuvieras dando un ejemplo mínimo).
He estado jugando con GAS durante más o menos un mes, y me he familiarizado bastante con el uso de operaciones por lotes para leer / escribir en / desde hojas de cálculo (por ejemplo, getValues (), setValues ()). Sin embargo, actualmente estoy escribiendo un script que extrae una gran cantidad de datos de Gmail utilizando la clase GmailApp, mi código se ejecuta muy lentamente (e incluso el tiempo de espera), y parece que no puedo entender cómo usar las operaciones por lotes por lo que intento hacer Aquí está mi código hasta ahora (con la dirección de correo electrónico y el nombre cambiados):
function fetchEmails(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var threads = GmailApp.search(''in: label:searchedLabel'');
var messages = new Array();
function Email(message){
this.date = new Date(message.getDate());
this.body = message.getBody();
}
for(var i=0;i<threads.length;i++){
for(var j=0;j<threads[i].getMessageCount();j++){
if(threads[i].getMessages()[j].getFrom()=="firstName lastName <[email protected]>"){
var message = new Email(threads[i].getMessages()[j]);
messages.push(message);
}
}
}
}
Como puede ver, estoy consultando mi correo electrónico para todos los hilos con la etiqueta dada, haciendo un constructor de objetos para un objeto de correo electrónico personalizado (que tendrá el cuerpo y la fecha de un correo electrónico como propiedades). Luego estoy recorriendo cada hilo y cuando un correo electrónico determinado coincide con el que estoy buscando, creo una instancia del objeto Email para ese correo y coloco ese objeto Email en una matriz. El objetivo es que al final tenga una serie de objetos de correo electrónico que son todos de mi remitente deseado. Sin embargo, como probablemente haya notado, el código llama a las API de Google con demasiada frecuencia, pero parece que no puedo deducir las operaciones por lotes para interactuar con Gmail. ¿Algunas ideas? Muchas gracias.