2017-03-05 5 views
0

for 루프는 실제로 문제가 발생합니다 (문제가 있습니까?).for 루프가 변수를 값으로 사용하지 않는 이유는 무엇입니까?

- GmailApp.getInboxThreads (k, max) [k]; 그러나 이것은 모든 다른 스레드를 건너 뛰었습니다. (이유를 말해 줄 수 있습니까?)

-이 경우는 k = 0이고 최대 = 100 인 경우에만 작동합니다. k = 100 및 max = 100을 시도하면 빈 데이터 세트가 생깁니다. 실행 로그는 k = 100이고 max = 100 인 경우 for 루프가 완전히 건너 뛴다는 것을 보여줍니다.

미리 도움을 주셔서 감사합니다. 루프 while 루프에 엄격 같다는 것을

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]를;

당신은 모든 스레드을 얻으려면 최대

의 범위의 K의 ONE 요소 K를 검색 :

var threads = GmailApp.getInboxThreads(); 
//OR 
var threads = GmailApp.getInboxThreads(k, max); 
//Where K is starting email and max maximum number of thread 
당신이 밖으로 배열에서 작업하기 때문에 귀하의 루프는 0부터 시작해야합니다

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(). VAR의 numEmails = sheet.getRange ("E2") getDisplayValue(). VAR 최대 = numEmails (VAR의 K = 0 는 k 번째 (0); – Clayten

+0

(0); var threads = GmailApp.getInboxThreads (startingEmail, max) [k]; // 가장 최근 스레드에서 최대 50 개의 스레드를 가져옵니다. 전에, 당신이 다시 루프에 있기 때문에 그것은 전에 있어야만합니다. 전화의 성도 – Yoann

+0

이 문제에 대한 의견이 있으십니까? http://stackoverflow.com/questions/42615392/transient-errors-skipping-blank-cells-with-if-clause – Clayten

0

주의 사항 :

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

다음 k < max false를 반환 K = 최대 = 100, 당신은 루프에 들어 가지 않도록 그래서 때문이다. k = max = 100을 유지하려면 k <= max (작거나 같음) 또는 do-loop를 사용해야합니다.

+0

감사합니다. Julien. 예, 문제였습니다. for 루프의 범위를 getInboxThreads()의 시작점과 최대 점과 동일한 것으로 처리했습니다. 이 문제에 대한 어떤 생각? http://stackoverflow.com/questions/42615392/transient-errors-skipping-blank-cells-with-if-clause – Clayten