2012-10-16 90 views
5

我正在嘗試執行一個簡單的谷歌腳本,該腳本處理每個由gmail用戶收到的郵件。
我發現確實是這樣的一個例子:
谷歌應用程序腳本和GmailApp:剛剛收到新消息

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 
    } 
} 

那就是:我遍歷收件箱中的所有郵件和搜索未讀的。只有1800條消息,這是非常緩慢的。
理想情況下,我正在尋找一個觸發器,一旦收到每個新消息就會被觸發。
如果沒有這樣的事情,我會嘗試利用這一點,我看到:

GmailApp.getMessageById(id) 

回答

3

可以使用

GmailApp.getInboxThreads(0, 50); 

初始化與前五郵件變量。

6

不幸的是,沒有觸發器會觸發每個收到的消息。然而,有一個很好的解決方法:

設置一個篩選規則,爲所有傳入消息分配一個特殊標籤「ToBeProcessedByScript」作爲示例。由於通配符在Gmail過濾器中不起作用,因此請使用to:字段。

運行時間觸發的腳本,收集所有新消息線程與GmailApp.getUserLabelByName("ToBeProcessedByScript").getThreads()。在處理新消息之前刪除特殊標籤。

+3

這種方法的一個小問題:標籤附加到線程,而不是消息。這意味着,隨着消息進入收件箱並被添加到已處理的現有線程,標籤將重新應用到線程,並且您的方法會再次處理線程中的每條消息。 這可以通過識別哪些郵件無法避免重新處理: **快速和骯髒的:**明星消息,並只處理那些未加星號** 緩慢而徹底:**記錄消息ID的地方,並重複檢查加工前/加工期間/加工後 – sahmeepee

8

對不起,對於遲到的迴應,但我只是有同樣類型的問題,我最終使用GmailApp.search()...希望這會有所幫助。

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

警告

當所有線程的尺寸過大的系統來處理此調用將失敗。如果線程大小未知,並且可能非常大,請使用「分頁」調用,並指定要在每次調用中檢索的線程範圍。

看看GmailApp.search(query)GmailApp.search(query, start, max)

1

爲djtek提及,但不是標籤的所有消息,然後檢索標記信息您可以創建一個時間觸發器,你可以得到的未讀郵件的數量,和檢索0線程的未讀郵件數,以下爲我的作品代碼:

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 
      } 
     } 
    } 
    } 
} 
+1

用長度代替'length()' –

+0

是的,你是對的。 – POSTHUMAN

2

如果第一條消息是真的一個是讀我已經擴展了檢查代碼。如果不是,它會檢查下一條消息,直到它找到未讀消息:

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 
      } 
     } 
    } 
    } 
} 
相關問題