如何捕获辅助函数的多行输出?

时间:2015-08-26 09:03:41

标签: javascript google-apps-script google-adwords

我为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 Apps脚本具有预建邮件方式:

MailApp.sendEmail(recipient, subject, body)

如果我把它放到辅助函数中,每次为一个数组元素完成一个循环时我会收到一封电子邮件,同时我没有找到一个有效的方法将它作为输出放在main函数中发生在辅助函数中。

因此,我如何聚合输出并将其存储在可从主函数中调用的变量中?


编辑:我已将afterProcessAllClientAccounts功能添加到代码中。这样调用,最终的Logger.log()输出只是给出了adGroup的每个account循环的最后指定结果。因此,对于narr[n],我得到了正确的输出或只是undefined。问题是while 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);
}
} 

1 个答案:

答案 0 :(得分:0)

documentation中所述,您可以使用函数executeInParallel(functionName, optionalCallbackFunctionName);,其中参数“functionName”是将对所有帐户执行的函数,在您的情况下,该函数称为“abc” ”。

另一个参数“optionalCallbackFunctionName”是在处理完所有帐户后将执行的函数的名称。

因此,您可以返回在日志'Campaign: ' + ag.getCampaign() + ' | AdGroup: ' + ag.getName() + ' | Ads: ' + n

中使用的相同字符串

然后回调函数将以数组形式接收此信息,然后您可以将所有字符串连接成一个大字符串,这样您现在只能发送一封包含所有不同帐户信息的电子邮件。希望这会有所帮助。