Google Ads API更新CampaignBudget的AmountMicros无报错但未生效问题
核心问题
操作类型配置错误,你使用了创建预算的操作来执行更新逻辑:
CampaignBudgetOperation下的Create字段专门用于新建预算,哪怕你传入了已有预算的ResourceName和Id,API也会忽略这些标识生成全新的预算实例,不会修改原有预算,因此你原来Campaign绑定的预算不会有任何变化,自然在后台看不到更新效果。
修复步骤
- 替换操作类型:将
CampaignBudgetOperation的Create属性改为Update即可,修改后代码如下:
CampaignBudget budget = new CampaignBudget() { ResourceName = ResourceNames.CampaignBudget(customerId, budgetId), AmountMicros = (price + amount) * 100000, Id = budgetId }; CampaignBudgetOperation budgetOperation = new CampaignBudgetOperation() { // 把原来的Create = budget改为Update = budget Update = budget, UpdateMask = FieldMasks.AllSetFieldsOf(budget), }; try { MutateCampaignBudgetsResponse responseBudget = budgetService.MutateCampaignBudgets( customerId.ToString(), new CampaignBudgetOperation[] { budgetOperation }); foreach(MutateCampaignBudgetResult result in responseBudget.Results) { updateResponse.CampignId = campaignId; updateResponse.Updated = true; // 调试时可以打印资源名确认修改的是目标预算 Console.WriteLine($"更新成功,预算资源名:{result.ResourceName}"); } return updateResponse; } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); updateResponse.Updated = false; return updateResponse; }
- 可选优化项:
- 手动指定
UpdateMask只更新amount_micros字段,避免误修改其他未明确要调整的属性,写法如下:UpdateMask = new FieldMask { Paths = { "amount_micros" } } - 原代码catch块中
return updateResponse后的throw语句永远不会执行,可以直接删除。 - 确认你传入的
budgetId是对应Campaign实际绑定的预算ID,避免操作错预算对象。
内容的提问来源于stack exchange,提问作者willsgobi
相关产品推荐
相关产品推荐

