2424
2525from google .ads .googleads .client import GoogleAdsClient
2626from google .ads .googleads .errors import GoogleAdsException
27- from google .ads .googleads .v22 .services .services .campaign_budget_service import (
28- CampaignBudgetServiceClient ,
27+ from google .ads .googleads .v22 .resources .types .campaign import Campaign
28+ from google .ads .googleads .v22 .resources .types .campaign_budget import (
29+ CampaignBudget ,
2930)
3031from google .ads .googleads .v22 .services .types .campaign_budget_service import (
3132 CampaignBudgetOperation ,
32- MutateCampaignBudgetsResponse ,
33- )
34- from google .ads .googleads .v22 .services .services .campaign_service import (
35- CampaignServiceClient ,
3633)
3734from google .ads .googleads .v22 .services .types .campaign_service import (
3835 CampaignOperation ,
39- MutateCampaignsResponse ,
4036)
41- from google .ads .googleads .v22 .resources .types .campaign_budget import (
42- CampaignBudget ,
37+ from google .ads .googleads .v22 .services .types .google_ads_service import (
38+ MutateGoogleAdsResponse ,
39+ MutateOperation ,
4340)
44- from google .ads .googleads .v22 .resources .types .campaign import Campaign
4541
4642
4743_DATE_FORMAT : str = "%Y%m%d"
4844
4945
5046async def main (client : GoogleAdsClient , customer_id : str ) -> None :
51- campaign_budget_service : CampaignBudgetServiceClient = client .get_service (
52- "CampaignBudgetService" , is_async = True
53- )
54- campaign_service : CampaignServiceClient = client .get_service (
55- "CampaignService" , is_async = True
56- )
47+ # Gets the GoogleAdsService client.
48+ googleads_service = client .get_service ("GoogleAdsService" , is_async = True )
49+
50+ # We are creating both the budget and the campaign in the same request, so
51+ # we need to use a temporary resource name for the budget to reference it
52+ # in the campaign.
53+ # Temporary resource names must be negative integers formatted as strings.
54+ # https://developers.google.com/google-ads/api/docs/batch-processing/temporary-ids
55+ budget_resource_name : str = f"customers/{ customer_id } /campaignBudgets/-1"
56+
57+ mutate_operations : List [MutateOperation ] = []
5758
5859 # Create a budget, which can be shared by multiple campaigns.
5960 campaign_budget_operation : CampaignBudgetOperation = client .get_type (
6061 "CampaignBudgetOperation"
6162 )
6263 campaign_budget : CampaignBudget = campaign_budget_operation .create
64+ campaign_budget .resource_name = budget_resource_name
6365 campaign_budget .name = f"Interplanetary Budget { uuid .uuid4 ()} "
6466 campaign_budget .delivery_method = (
6567 client .enums .BudgetDeliveryMethodEnum .STANDARD
6668 )
6769 campaign_budget .amount_micros = 500000
6870
69- # Add budget.
70- budget_operations : List [CampaignBudgetOperation ] = [
71- campaign_budget_operation
72- ]
73- campaign_budget_response : MutateCampaignBudgetsResponse = (
74- await campaign_budget_service .mutate_campaign_budgets (
75- customer_id = customer_id ,
76- operations = budget_operations ,
77- )
78- )
71+ mutate_operation_budget : MutateOperation = client .get_type ("MutateOperation" )
72+ mutate_operation_budget .campaign_budget_operation = campaign_budget_operation
73+ mutate_operations .append (mutate_operation_budget )
7974
8075 # Create campaign.
8176 campaign_operation : CampaignOperation = client .get_type ("CampaignOperation" )
@@ -92,7 +87,8 @@ async def main(client: GoogleAdsClient, customer_id: str) -> None:
9287
9388 # Set the bidding strategy and budget.
9489 campaign .manual_cpc = client .get_type ("ManualCpc" )
95- campaign .campaign_budget = campaign_budget_response .results [0 ].resource_name
90+ # Reference the budget created in the same request.
91+ campaign .campaign_budget = budget_resource_name
9692
9793 # Set the campaign network options.
9894 campaign .network_settings .target_google_search = True
@@ -121,12 +117,21 @@ async def main(client: GoogleAdsClient, customer_id: str) -> None:
121117 campaign .end_date = datetime .date .strftime (end_time , _DATE_FORMAT )
122118 # [END add_campaigns_1]
123119
124- # Add the campaign.
125- campaign_operations : List [CampaignOperation ] = [campaign_operation ]
126- campaign_response : MutateCampaignsResponse = await campaign_service .mutate_campaigns (
127- customer_id = customer_id , operations = campaign_operations
120+ mutate_operation_campaign : MutateOperation = client .get_type (
121+ "MutateOperation"
122+ )
123+ mutate_operation_campaign .campaign_operation = campaign_operation
124+ mutate_operations .append (mutate_operation_campaign )
125+
126+ # Issue a mutate request to add the budget and campaign.
127+ response : MutateGoogleAdsResponse = await googleads_service .mutate (
128+ customer_id = customer_id , mutate_operations = mutate_operations
128129 )
129- print (f"Created campaign { campaign_response .results [0 ].resource_name } ." )
130+
131+ # Check the result for the campaign (index 1 in the operations list).
132+ # The response returns results in the same order as operations.
133+ campaign_result = response .mutate_operation_responses [1 ].campaign_result
134+ print (f"Created campaign { campaign_result .resource_name } ." )
130135
131136
132137if __name__ == "__main__" :
0 commit comments