2017-03-05 84 views
0

這個for循環確實存在問題是準確的(我有問題?)。爲什麼for循環沒有將變量作爲值:

- 正在使用GmailApp.getInboxThreads(k,max)[k];但是這會跳過所有其他線程。 (你能告訴我爲什麼嗎?)

- 現在這隻適用於k = 0和max = 100的情況。如果我試圖做k = 100和max = 100,我會得到一組空白的數據。執行日誌顯示,當k = 100且最大= 100時,for循環完全被跳過。

謝謝您的幫助!

function newEmailAddressList(){ 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("NewEmails"); 
var range = sheet.getRange("A3:Q"); 
var varRange = sheet.getRange("A2:G2"); 
var addrA = []; 



range.clearContent(); //May need to change this to my delete function to speed things up. 

var contact = ContactsApp.getContacts();  //var contact = ContactsApp.getContacts(); 

////////// 

    for(var i = 0; i < contact.length; i++){  //for(var i = 0;i < contact.length;i++){ 

    //var addrA = [];        //var addrA = []; This can't be here. It is not global or accessable if it is in this loop and the other global version doesn't access it apparently 

    var addresses = contact[i].getEmails();  // var addresses = contact[i].getEmails(); 

    for(var j = 0;j < addresses.length; j++){ //for(var j = 0;j < addresses.length;j++) {       

     var address = addresses[j].getAddress();    // s += addresses[j].getAddress() + br; 

    addrA.push(address);      // 
    }; 


}; /////////////////////AT THIS POINT CONTACTS ARRAY IS COMPLETE///////////////////////// 

var joinAddr = addrA.join(); 
//var lowerAddr = joinAddr.toLowerCase(); 

var startingEmail = sheet.getRange("C2").getValue(); 
var numEmails = sheet.getRange("E2").getValue(); 

var max = numEmails; 



for (var k = startingEmail; k<max; ++k){ 

var threads = GmailApp.getInboxThreads()[k]; //get max threads starting at most recent thread 
var messages = threads.getMessages()[0]; 

     var sndr; 
     var rcpnt; 
     var srAry = []; 



     var sndr = messages.getFrom().replace(/^.+<([^>]+)>$/, "$1"); //http://stackoverflow.com/questions/26242591/is-there-a-way-to-get-the-specific-email-address-from-a-gmail-message-object-in  
     var sndrLower = sndr.toLowerCase; 

     var rcpnt = messages.getTo().replace(/^.+<([^>]+)>$/, "$1"); 
     var rcpntLower = rcpnt.toLowerCase; 

     var cc = messages.getCc().replace(/^.+<([^>]+)>$/, "$1"); 
     var ccLower = cc.toLowerCase; 

     //srAry.push(sndr); 
     //srAry.push(rcpnt); 
     //srAry.push(cc); 



    var isIn = joinAddr.search(sndr || rcpnt); 

    if(isIn == -1){ 

     var instance = k; 
     var dat = messages.getDate(); 
     //var sndr = messages.getFrom(); 
     //var rcpnt = messages.getTo(); 
     var sub = messages.getSubject(); 
     var msg = messages.getPlainBody(); 


     var info = [instance,dat,sndr,rcpnt,cc,sub,msg]; 

     sheet.appendRow(info); //appendRow only works with sheet class not range class 



};//else{ break; }; 

}; 

//Browser.msgBox(("Here are your New Contacts from Emails "k" through "k + max"!")); 

getContactGroups(); 

}; 

回答

0

我認爲您在使用Gmail API或如何運行for循環時遇到問題。

關於第一個問題,檢查Gmail API doc

您可以使用:

getInboxThreads() 
//OR 
getInboxThreads(start, max) 
// Where start if the index of the first of thread and max is the maximum number of thread retrieved 

所以,當你這樣做: GmailApp.getInboxThreads(K,最大)[K]

您檢索ONE範圍內的K元件K爲最大

爲了得到的所有線程

var threads = GmailApp.getInboxThreads(); 
//OR 
var threads = GmailApp.getInboxThreads(k, max); 
//Where K is starting email and max maximum number of thread 

,因爲你是一個陣列上工作了您的循環必須從零開始上下文GmailApp。所以:

var threads = GmailApp.getInboxThreads(k, max); 
//threads is an array of threads range from 0 to max? 
//Don't use k again! 
for(var i=0; i<threads.length;i++){ 
var currentThread = threads[i]; 
//do what you need with the thread 
} 
+0

謝謝!保持k = 0解決了我的問題。我已經把這樣的代碼:它更好地工作之前或在循環後有「gmailApp.GetInboxThreads VAR joinAddr = addrA.join(); // VAR lowerAddr = joinAddr.toLowerCase(); ? VAR startingEmail = sheet.getRange( 「C2」)getDisplayValue(); 變種另外NUMEMAILS = sheet.getRange( 「E2」)getDisplayValue(); 變種最大=另外NUMEMAILS; 爲(VAR K = 0; k Clayten

+0

之前,它必須在之前,因爲你循環致電 – Yoann

+0

對此問題有任何想法? http://stackoverflow.com/questions/42615392/transient-errors-skipping-blank-cells-with-if-clause – Clayten

0

注意for循環嚴格等於while循環:

//for (/*Init*/; /*Cond*/; /*Step*/) { /*Action*/ } 
//stricty equal to : 
/*Init*/; 
while (/*Cond*/) { 
    /*Action*/; 
    /*Step*/; 
} 

是因爲K =最大值= 100,那麼k < max返回false,這樣你就不會在環進入。 如果你想保持k = max = 100,那麼你應該使用k <= max(小於等於)或do循環。

+0

謝謝朱利安。是的,這是問題所在。我將for循環中的範圍視爲與getInboxThreads()中的start和max點相同的東西。對這個問題有什麼想法? http://stackoverflow.com/questions/42615392/transient-errors-skipping-blank-cells-with-if-clause – Clayten

相關問題