2015-08-26 22 views
0

我已經爲AdWords編寫了一個小的Javascript腳本,它通過多個帳戶的多個廣告系列和廣告組循環,然後保存結果。如何捕獲幫助函數的多行輸出?

儘管腳本工作得很好,但我希望在完成循環後存儲完整結果並將其作爲電子郵件發送出去,並且我很難使其工作。

的代碼看起來是這樣的:

function main() { 
MccApp.accounts().withIds([arr1,arr2,...,arrX])..executeInParallel('abc', 'afterProcessAllClientAccounts'); 
} 

function abc() { 
// Select campaigns, adgroups and loop through them... 
// Now comes the somewhat critical part: 

var n = 0; 

while(aditer.hasNext()) { 
    n++; 
    aditer.next(); 
} 

if(n < 4){ 

Logger.log('Campaign: ' + ag.getCampaign() + ' | AdGroup: ' + ag.getName() + ' | Ads: ' + n); 

} 
} 

function afterProcessAllClientAccounts(results) { 
for (var i = 0; i < results.length; i++) { 
var result = results[i].getReturnValue(); 
Logger.log(result); 
} 
} 

現在我想用多線Logger.log()輸出發送一封電子郵件,一旦循環完成,我遇到的問題。 AdWords的Google Apps腳本有一個預置的郵寄方法:

MailApp.sendEmail(recipient, subject, body) 

如果我把它放到輔助功能,我每一個循環結束了數組元素的一次收到一封電子郵件,在同一時間我沒有找到一個有效的方法將它放在主函數中,因爲輸出發生在輔助函數中。

因此,我如何聚合輸出並將其存儲在可從主函數內調用的變量中?


編輯:我已經添加了afterProcessAllClientAccounts功能的代碼。像這樣調用它,最後的Logger.log()輸出簡單地給出了account的每個adGroup循環的最後指定結果。因此,對於narr[n],我得到一個正確的輸出或簡單地undefined。問題是,雖然adGroup循環似乎完全重置記錄器。我今天嘗試了另一種解決方案是推動每個日誌結果在if (n < 4)聲明數組作爲這樣的:

var test = []; 

function main() { 
//foo 
} 

function abc(){ 
//foo 
// while adGroup loop: 

var n = 0; 

while(aditer.hasNext()) { 
    n++; 
    aditer.next(); 
} 

if(n < 4){ 

var c = 'Campaign: ' + ag.getCampaign() + ' | AdGroup: ' + ag.getName() + ' | Ads: ' + n; 

test.push(c); 
//or 
test[test.length] = 'Campaign: ' + ag.getCampaign() + ' | AdGroup: ' + ag.getName() + ' | Ads: ' + n; 
} 

//back in the adGroup loop 
Logger.log(test); 
} 
//end of function 
} 

此外,在這種情況下,日誌僅無論是包含一個[]或每行實際的正確的輸出,如果條件是但它從來沒有真正將值附加到test,而是將其替換爲最終輸出只是一個空數組。這可能是我在這裏忽略的一個非常小的細節,我和其他幾個更有經驗的人坐在一起,沒有一個找到解決方案。


編輯2:修改代碼並將所有單個結果連接成一個數組。輸出返回正確的行數(等於帳戶數),但數組始終爲空。

function afterProcessAllClientAccounts(results) { 
for (var i = 0; i <= results.length; i++) { 
var result = []; 
var s_result = results[i].getReturnValue(); 
result.concat(s_result); 
Logger.log(result); 
} 
} 

回答

0

documentation提到的,你可以使用函數executeInParallel(functionName, optionalCallbackFunctionName);其中參數「functionName」是在你的情況下,函數被稱爲「ABC」將被excecuted所有帳戶的功能。

其他參數「optionalCallbackFunctionName」是將在所有帳戶處理完畢後執行的函數的名稱。

所以,你可以回到你的日誌'Campaign: ' + ag.getCampaign() + ' | AdGroup: ' + ag.getName() + ' | Ads: ' + n

使用相同字符串,則回調函數將收到此信息作爲數組,然後您可以連接所有的字符串成一個大的字符串,所以你現在可以只發送一封電子郵件,包含所有不同賬戶的信息。希望這可以幫助。

+0

嗨赫拉爾多,謝謝你的回答。我閱讀有關optionalCallbackFunction的文檔,但我無法爲它工作。雖然我從邏輯上理解了它的概念,並且還了解了你在最後一段中寫的內容,但不幸的是,我無法讓代碼適用於我。我不想問這個問題,但是你能否明確地舉一個例子說明你如何編寫最後一段代碼?我嘗試了其他代碼,比如'var c = [ag.getCampaign(),ag.getName(),n];'然後'results.push(c);''''''results''是一個全局變量數組並將其用作'body'參數。沒有工作。 – thenaturalist

+0

我在一天內徹底嘗試了您的方法,不幸的是,它對我來說根本不起作用。如果我將它記錄在'if(n <4){}'語句中並且大部分回調函數的返回值都是'undefined',我只會得到記錄結果的一部分。 – thenaturalist

+0

你可以用你的更新代碼編輯你的文章嗎?回調函數是否沒有被執行?或者它沒有收到'abc'函數的結果? – Gerardo