GmailApp.getMessagesForThreads () restituisce troppi messaggi

Sep 03 2020

Voglio restituire un elenco di tutti gli oggetti di posta elettronica ricevuti in un giorno specificato, nel mio account Gmail. Se è presente più di un messaggio con lo stesso oggetto, desidero avere un numero di quanti ce ne sono. Questo è quello che ho fatto:

var emailThreads = GmailApp.search("subject:<partial_subject> after:2020/8/30 before:2020/8/31");
var messages = GmailApp.getMessagesForThreads(emailThreads);

Ciò restituisce "un array di array di messaggi, dove ogni elemento nell'array esterno corrisponde a un thread e l'array interno contiene i messaggi in quel thread".

Provo ad accedere ai dati di cui ho bisogno in questo modo:

for (i = 0; i < messages.length; i++) {
  messages[i][0].getSubject() // a subject
  messages[i].length          // number of messages with the same subject
}

Tuttavia, questo restituisce più messaggi di quelli visualizzati nell'interfaccia utente di Gmail.

Ecco cosa ho notato:

  • succede solo ai thread con più di un messaggio
  • non succede a tutti i thread con più di un messaggio
  • ogni volta che eseguo il mio script per lo stesso giorno, il risultato è lo stesso
  • quando eseguo il mio script per giorni diversi, il risultato è diverso anche se sono state ricevute le stesse email

Considerando che questo codice è molto semplice e sto utilizzando solo metodi forniti da Google, presumo di aver frainteso qualcosa o Gmail sta facendo qualcosa di strano con i messaggi nei thread.

Qualche idea su cosa potrebbe essere e su come aggirarlo?


Modifica: ho notato che c'è una casella di controllo "Non includere chat" nel filtro di Gmail, che aggiunge "-in: chat" nella query di ricerca, ma non ha aiutato neanche. Ho anche provato ad aggiungere "in: inbox" alla query, ma senza modificare il risultato.

Risposte

1 Marios Sep 03 2020 at 21:20

Spiegazione:

  • Il motivo per cui ricevi troppi messaggi è perché i tuoi criteri di filtro attuali non interrogano solo le email, ma anche i messaggi di Hangout o altri thread piuttosto che le email.

  • Usa questo per ottenere gli oggetti di tutte le email:

    var emailThreads = GmailApp.search("is:inbox after:2020/8/30 before:2020/8/31");
    

Soluzione:

Ecco come apparirebbe il codice completo:

function myFunction() {
  
  var emailThreads = GmailApp.search("is:inbox after:2020/8/30 before:2020/8/31");
  var messages = GmailApp.getMessagesForThreads(emailThreads);
  var messageArr = [];
   
  for (i = 0; i < messages.length; i++) {
  Logger.log(messages[i][0].getSubject()) // a subject
  Logger.log(messages[i].length)        // number of messages with the same subject
}
      
  messages.forEach(m=>{
         messageArr.push({
         subject: m[0].getSubject(),
         num_messages:m.length
  })});    
}
  • Ho anche creato per te un array json messageArrche contiene tutti i nomi degli oggetti e il numero di messaggi per ogni soggetto.
Rubén Sep 03 2020 at 21:20

Dalla domanda

Tuttavia, questo restituisce più messaggi di quelli visualizzati nell'interfaccia utente di Gmail.

Potrebbero esserci delle ragioni per questo

  1. I messaggi nel Cestino e Spam non vengono visualizzati nei risultati di ricerca sull'interfaccia utente di Gmail (a meno che tu non includa in:anywhere, in modo testuale)
  2. L'interfaccia utente non mostra tutti i messaggi perché i risultati potrebbero essere impaginati e te lo sei perso
  3. Dopo la ricezione / importazione / eliminazione di un numero elevato di messaggi, si verifica un notevole ritardo nel visualizzarli sull'interfaccia utente, quindi anche se sembra che tu abbia raggiunto l'ultima pagina dei risultati di ricerca, attendi qualche minuto e rimpiangere la pagina web di Gmail.

getMessagesForThreadsrestituire messaggi che potrebbero non essere visualizzati nei risultati di ricerca dell'interfaccia utente di Gmail perché sono stati inviati allo Spam o al Cestino .

Per confrontare correttamente i risultati dell'interfaccia utente di Gmail con i risultati di questo metodo, includi nell'interfaccia utente di Gmail in:anywherecome parte della ricerca. L'istruzione di ricerca completa sarà simile a questa:

in:anywhere subject:<partial_subject> after:2020/8/30 before:2020/8/31

Come accennato nella prima parte di questa risposta, potresti dover aggiornare più volte la pagina web di Gmail per essere sicuro che non ci siano messaggi resi disponibili di recente tramite l'interfaccia utente web.

Relazionato

  • Come impedire che i thread di Gmail tornino

Risorse

  • Operatori di ricerca che puoi utilizzare con Gmail