2016-11-18 36 views
0

我正在使用以下腳本根據某些搜索條件從gmail中提取電子郵件地址,並將它們輸出到Google電子表格中。在功能上,腳本的工作原理和做我想做的事情。Google電子郵件提取腳本 - 超出了最大執行時間(不管是什麼)

但是,由於gmail腳本的最長執行時間似乎爲五分鐘,所以我在運行腳本時不斷得到「超出最大執行時間」。我使用少量電子郵件在gmail中使用較小的標籤對其進行了測試,腳本運行成功並按預期輸出電子郵件。但是,當我嘗試使用更多電子郵件提取大批量的任何內容時,腳本無法完成。

此腳本與我在網絡上找到的其他內容相似。我試圖通過在try塊中添加for循環來修改這個超時問題,並且異常被捕獲併發送到睡眠狀態,以便腳本可以暫停執行並且不超過時間限制,但是這不起作用。我還嘗試了其他方法發送腳本進入睡眠狀態,以防止發生超時,但這些方法不成功。

有人可以幫助我防止發生超時,或者使用一些更有效的方式來搜索電子郵件線程來抓取電子郵件嗎?

編輯:我已經修改了添加了建議的代碼,但是如果沒有達到執行時間限制,它仍然無法完成。任何想法爲什麼劇本不暫停?我也嘗試使用GmailApp.search搜索一條消息(搜索,0,1),但是當我搜索我的收件箱時腳本不會完成。

function extractEmailAddresses() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var userInputSheet = ss.getSheets()[0]; 

    var labelName = userInputSheet.getRange("B2").getValue(); 
    var keyword = userInputSheet.getRange("C2").getValue(); 

    var sheetName = "Label: " + labelName; 
    var sheet = ss.getSheetByName (sheetName) || ss.insertSheet (sheetName, ss.getSheets().length); 
    sheet.clear(); 

    var messageData = []; 

    var search = "label:" + label + "is:unread " + keyword; 

    // Process 50 Gmail threads in a batch to prevent script execution errors 
    var threads = GmailApp.search(search, 1, 1);  

    var messages, from, email, subject, mailDate; 

    try { 

    for (var x=0; x<threads.length; x++) { 

     var message = threads[x].getMessages()[0]; //Get message for thread 
     from = message.getFrom(); 
     mailDate = message.getDate(); 
     from = from.match(/\[email protected]\S+\.\S+/g); 

     if (from.length) {    

     email = from[0]; 
     email = email.replace(">", ""); 
     email = email.replace("<", "");  

     //push emails to array 
     messageData.push ([email, mailDate]); 
     } 
    } 
    } 

    catch (e) { 
    //Pause script to prevent exceeded timeout error 
    Logger.log(e.toString()); 
    Utilities.sleep(5000); 
    } 

    //Adding our emails to the spreadsheet 
    sheet.getRange (1, 1, messageData.length, 2).setValues (messageData); 

} 

回答

0

兩個快速的想法,我不詳細看了一下,不知道這種API:

  1. 不要叫getMessages兩次:

    替換:

    from = threads[x].getMessages()[0].getFrom(); 
    mailDate = threads[x].getMessages()[0].getDate(); 
    

    有:

    var message = threads[x].getMessages()[0]; 
    from = message.getFrom(); 
    mailDate = message.getDate(); 
    
  2. 避免在每次迭代中使用setValue:單個單元格更新到電子表格將會很慢,因爲每次都需要與表單基礎結構進行通信並提交一個值。取而代之的是,建立了單元格值的更大的陣列,以改變和設置,一次就全部使用setValues(Object[][])

這些都是從看一眼剛剛的想法,對不起。

+0

感謝您的建議。我已經相應地修改了腳本,但腳本仍然無法在正常時間框架內完成。 – Touchstone57

+0

我建議你用一個調試器或者做一些時間來計算出正在進行的時間。例如調用'var threads = GmailApp.search(搜索,0,50)多久?'採取?這是多數?或者它實際上主要是在循環結果?通過對腳本進行分析以確定所花時間的位置,可以確定哪些地方可以進行改進。 – Bardy

+0

它似乎是'var threads = GmailApp.search(搜索,0,50);'可能會花費最多的時間,因爲我將其更改爲'var threads = GmailApp.search(search,0,5);'查看較少的線程,但它仍然無法及時完成,因爲它搜索收件箱。這是因爲收件箱太大?當我嘗試使用較少的電子郵件搜索標籤時,它可以工作,但我需要它也可以使用更大的數據集。我會按照你的建議嘗試調試,謝謝。 – Touchstone57

相關問題