我已经为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