2014-09-29 50 views
0

你好,我試圖設置每個n周的事件爲gmail-snooze,因此這將不僅是一次事件reocurring。getThreads()與兩個標籤Gmail的貪睡腳本

我想將everyXweek帶標籤的線程從已經創建的Xweek標籤線程保存到「newpage」中的「page」數組中。我使用page = oldLabel.getThreads(0, 100);來獲取Xweek數據。

我試圖newpage = everyXweekLabel.page;newpage = page[everyXweekLabel];但NEWPAGE永遠不會變成與線陣列....所以它不工作...

我怎麼會喜歡這樣的工作:

  1. 線程會有多個標籤。
  2. XweekSnooze是我們的迭代倒計時計時標籤
  3. everyXweekSnooze是我們的靜態標籤重置線程一旦放置在收件箱中

一個例子是thread#1已經1weekSnooze左(這將在第二天被刪除迭代),它也有一個every8weekSnooze標籤(這將需要申請一個8weekSnooze標籤一旦郵件被放入收件箱)

8weekSnooze標籤應用於它然後遍歷(7 weekSnooze,6 ...),直到它再次放入收件箱,every8weekSnooze標籤重新放置另一個8weekSnooze標籤進行迭代。

我可以使這項工作爲n周,但我無法獲得每週n周工作,因爲我無法弄清楚如何從先前拉動的包含Xweek標籤和其他標籤的拉動頁面線程好。

任何幫助你可以擴展肯定會非常感激!

謝謝。

JP

function getLabelNameXWeekSnooze(i) { 
    return "Snooze/" + i + "weekSnooze"; 
} 

function getLabelNameEveryXWeekSnooze(i) { 
    return "Snooze/" + "every" + i + "weekSnooze"; 
} 

function moveWeekSnoozes() { 
    var oldLabel, newLabel, page; 
    for (var i = 1; i <= WEEKS_TRACKED; ++i) { 
     newLabel = oldLabel; 
     oldLabel = GmailApp.getUserLabelByName(getLabelNameXWeekSnooze(i)); 
     page = null; 
     newpage = null; 

     // Get threads in "pages" of 100 at a time 
     while(!page || page.length == 100) { 
      page = oldLabel.getThreads(0, 100); 
      if (page.length > 0) { 
       if (newLabel) { 
        // Move the threads into "today’s" label 
        newLabel.addToThreads(page); 
      } else { 
       // Time to Unsnooze 
       GmailApp.moveThreadsToInbox(page); 
       if (MARK_UNREAD) { 
        GmailApp.markThreadsUnread(page); 
       } 

       // after returning mail to inbox please create an 
       // XweekSnooze label for every thread in page that has associated everyXweekSnooze label 
       // for example every3weekSnooze thread will need 3weekSnooze label to iterate/delay from 
       for (var j = 1; j <= WEEKS_TRACKED; ++j) { 
        // format the label data    
        everyXweekLabel = GmailApp.getUserLabelByName(getLabelNameEveryXWeekSnooze(j)); 
        XweekLabel = GmailApp.getUserLabelByName(getLabelNameXWeekSnooze(j)); 

        //trying to grab all thread from page that have everyXweek label and save to new page 
        newpage = everyXweekLabel.page; 
        if (newpage.length > 0) { 
         XweekLabel.addToThreads(newpage); 
        } 
       }  

       // Move the threads out of "yesterday’s" label 
       oldLabel.removeFromThreads(page); 
      } 
     } 
    } 
} 

回答

0

作爲參考,原始的Gmail延後算法可以在這裏找到:Gmail Snooze with Apps Script。該算法基於在線程上滲透一組Gmail標籤的想法,使用Apps腳本觸發器處理時間。

基本上,您的問題中的問題歸結爲需要找到一組Gmail線程,它們都有兩個指定的標籤(即具有標籤A的線程集合和具有標籤B的線程集合)。

應用程序腳本不提供這樣做的直接方式,所以你必須做一些工作。該方法非常簡單:獲取具有標籤A的線程集,遍歷它們以檢查標籤B的每個線程,然後記錄包含兩者的線程。

在這種情況下,我們將使用一個對象來記錄已經移動到收件箱但現在需要重置的線程。調整所有其他標籤後,我們將會有一個單獨的重置步驟。單獨做這件事很重要,因爲如果您在滲透過程中重置線程,您將無意中調整線程太多次。

function moveSnoozes() { 
    var oldLabel, newLabel, page; 

    // Set up an empty record of threads that will need 
    // to be reset 
    var resets = {}; 
    for (var i = 1; i <= WEEKS_TRACKED; ++i) { 
    resets[getLabelNameXWeekSnooze(i)] = []; 
    } 

    for (var i = 1; i <= WEEKS_TRACKED; ++i) { 
    newLabel = oldLabel; 
    oldLabel = GmailApp.getUserLabelByName(getLabelNameXWeekSnooze(i)); 
    page = null;  
    // Get threads in "pages" of 100 at a time 
    while(!page || page.length == 100) { 
     page = oldLabel.getThreads(0, 100); 
     if (page.length > 0) { 
     if (newLabel) { 
      // Move the threads into "today’s" label 
      newLabel.addToThreads(page); 
     } else { 
      // Unless it’s time to unsnooze it 
      GmailApp.moveThreadsToInbox(page); 
      if (MARK_UNREAD) { 
      GmailApp.markThreadsUnread(page); 
      } 

      // Now check for everyXweekSnooze label and 
      // record individual threads that need to be reset 
      for(var t=0; t<page.length; t++) { 
      var thread = page[t]; 
      var resetLabel = findResetLabel(thread); 
      if(resetLabel) { 
       resets[resetLabel.getName()].push(thread); 
      } 
      } 

      if (ADD_UNSNOOZED_LABEL) { 
      GmailApp.getUserLabelByName("Unsnoozed") 
       .addToThreads(page); 
      }   
     }  
     // Move the threads out of "yesterday’s" label 
     oldLabel.removeFromThreads(page); 
     } 
    } 
    } 

    // Reset recorded threads 
    for (var i = 1; i <= WEEKS_TRACKED; ++i) { 
    var resetLabelName = getLabelNameXWeekSnooze(i); 
    var resetLabel = GmailApp.getUserLabelByName(resetLabelName); 
    resetLabel.addToThreads(resets[resetLabelName]);  
    } 
} 

// Given a GmailThread, check to see if it has 
// any of the everyXweekSnooze labels and return 
// the first one found 
// @param {Object} thread - GmailThread to examine 
// @return {Object} GmailLabel - the first everyXweekSnooze 
// label found, or null if none are found 
function findResetLabel(thread) { 
    for (var i = WEEKS_TRACKED; i >= 1; i--) { 
    var label = getLabelNameEveryXWeekSnooze(i); 
    var labels = thread.getLabels(); 
    for (var j = 0; j < labels.length; j++) { 
     if(labels[j].getName() == label) { 
     return GmailApp.getUserLabelByName(getLabelNameXWeekSnooze(i)); 
     } 
    } 
    } 
    return null; 
}