我已經爲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
循環的最後指定結果。因此,對於n
行arr[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);
}
}
嗨赫拉爾多,謝謝你的回答。我閱讀有關optionalCallbackFunction的文檔,但我無法爲它工作。雖然我從邏輯上理解了它的概念,並且還了解了你在最後一段中寫的內容,但不幸的是,我無法讓代碼適用於我。我不想問這個問題,但是你能否明確地舉一個例子說明你如何編寫最後一段代碼?我嘗試了其他代碼,比如'var c = [ag.getCampaign(),ag.getName(),n];'然後'results.push(c);''''''results''是一個全局變量數組並將其用作'body'參數。沒有工作。 – thenaturalist
我在一天內徹底嘗試了您的方法,不幸的是,它對我來說根本不起作用。如果我將它記錄在'if(n <4){}'語句中並且大部分回調函數的返回值都是'undefined',我只會得到記錄結果的一部分。 – thenaturalist
你可以用你的更新代碼編輯你的文章嗎?回調函數是否沒有被執行?或者它沒有收到'abc'函數的結果? – Gerardo