2015-08-26 17 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