2017-03-05 83 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

相关问题