Google Ads脚本超时如何优化?含拒登广告排查多层循环场景
优化Google Ads脚本解决超时问题
你的脚本超时主要源于三层嵌套循环带来的大量API调用,以及频繁向Sheets写入数据的低效操作。以下是针对性的优化方案:
核心优化方向
- 直接筛选含违规广告的广告组:跳过逐广告组遍历广告的步骤,通过AdsApp的条件查询直接定位存在
DISAPPROVED广告的广告组,大幅减少API请求次数。 - 批量写入数据:先将所有待记录内容存入数组,最后一次性写入Sheets,避免多次调用
appendRow(该操作每次都会触发网络请求,耗时极高)。 - 减少重复API调用:提前缓存账户名称,避免在循环中重复调用获取接口。
优化后的代码
function main() { var sheetId = 'XXX'; var sheetName = 'XXX'; var spreadsheet = SpreadsheetApp.openById(sheetId); var sheet = spreadsheet.getSheetByName(sheetName); // 初始化表格 if (!sheet) { sheet = spreadsheet.insertSheet(sheetName); } else { sheet.clearContents(); } // 准备表头和结果数组 var headers = ['Account Name', 'Campaign', 'Ad Group']; var results = [headers]; // 把表头纳入结果数组,最后统一写入 // 遍历所有客户账户 var accountIterator = AdsManagerApp.accounts().get(); while (accountIterator.hasNext()) { var account = accountIterator.next(); AdsManagerApp.select(account); var accountName = account.getName(); // 提前缓存账户名,减少重复API调用 // 直接筛选:包含至少一个DISAPPROVED广告的启用状态广告组 var adGroupIterator = AdsApp.adGroups() .withCondition('CampaignStatus = ENABLED') .withCondition('AdGroupStatus = ENABLED') .withCondition('AdsPolicyApprovalStatus = DISAPPROVED') // 关键:过滤目标广告组 .get(); // 收集符合条件的广告组数据 while (adGroupIterator.hasNext()) { var adGroup = adGroupIterator.next(); results.push([ accountName, adGroup.getCampaign().getName(), adGroup.getName() ]); } } // 批量写入所有数据 if (results.length > 1) { // 仅当存在非表头数据时执行写入 sheet.getRange(1, 1, results.length, results[0].length).setValues(results); } }
优化细节说明
- 条件筛选广告组:通过
AdsPolicyApprovalStatus = DISAPPROVED条件,让Google Ads API直接返回目标广告组,省去了遍历每个广告组下所有广告的冗余操作,API调用量骤减。 - 批量写入:将所有记录存入数组后用
setValues一次性写入,把网络请求次数从N次压缩到1次,效率提升显著。 - 缓存账户名:在账户循环中提前获取并存储账户名称,避免在广告组循环中重复调用
account.getName(),减少不必要的API开销。
内容的提问来源于stack exchange,提问作者Ibrahim Ayoup
相关产品推荐
相关产品推荐

