Pour modifier plusieurs types de ressources dans une seule requête ou envoyer toutes les modifications à un point de terminaison unifié, utilisez GoogleAdsService.Mutate. Pour obtenir la liste complète des opérations compatibles, consultez la documentation de référence sur MutateOperation.
Opérations de mutation
Chaque MutateGoogleAdsRequest accepte un MutateOperation répété dans son champ mutate_operations :
- Opérations de mutation de ressources : chaque entrée peut spécifier une seule opération
create,updateouremovepour un type de ressource. - Opérations d'action : chaque entrée peut également spécifier une opération d'action, telle que
book_campaigns_operationouquote_campaigns_operation.
Pour créer des entités dépendantes (telles qu'une campagne et un groupe d'annonces) dans un seul appel GoogleAdsService.Mutate, créez deux entrées MutateOperation (une contenant un CampaignOperation et une autre contenant un AdGroupOperation). Attribuez un nom de ressource temporaire avec un ID négatif (tel que customers/CUSTOMER_ID/campaigns/-1) à la campagne afin que l'opération du groupe d'annonces puisse y faire référence dans la même requête :
Python
import uuid campaign_budget_service = client.get_service("CampaignBudgetService") campaign_service = client.get_service("CampaignService") googleads_service = client.get_service("GoogleAdsService") campaign_budget_resource_name = campaign_budget_service.campaign_budget_path( customer_id, budget_id ) temp_campaign_resource_name = campaign_service.campaign_path(customer_id, "-1") mutate_operation1 = client.get_type("MutateOperation") campaign = mutate_operation1.campaign_operation.create campaign.resource_name = temp_campaign_resource_name campaign.name = f"Bulk Mutate Campaign #{uuid.uuid4()}" campaign.advertising_channel_type = ( client.enums.AdvertisingChannelTypeEnum.SEARCH ) campaign.status = client.enums.CampaignStatusEnum.PAUSED campaign.manual_cpc = client.get_type("ManualCpc") campaign.campaign_budget = campaign_budget_resource_name campaign.contains_eu_political_advertising = ( client.enums.EuPoliticalAdvertisingStatusEnum.DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING ) mutate_operation2 = client.get_type("MutateOperation") ad_group = mutate_operation2.ad_group_operation.create ad_group.name = "Bulk Mutate Ad Group" ad_group.campaign = temp_campaign_resource_name ad_group.status = client.enums.AdGroupStatusEnum.ENABLED response = googleads_service.mutate( customer_id=customer_id, mutate_operations=[mutate_operation1, mutate_operation2], ) for op_response in response.mutate_operation_responses: result_type = op_response._pb.WhichOneof("response") result = getattr(op_response, result_type) print(f"Created {result_type}: {result.resource_name}")
Ruby
campaign_budget_resource_name = client.path.campaign_budget(customer_id, budget_id) temp_campaign_resource_name = client.path.campaign(customer_id, -1) mutate_operation1 = client.operation.mutate do |m| m.campaign_operation = client.operation.create_resource.campaign do |c| c.resource_name = temp_campaign_resource_name c.name = "Bulk Mutate Campaign #{(Time.new.to_f * 1000).to_i}" c.advertising_channel_type = :SEARCH c.status = :PAUSED c.manual_cpc = client.resource.manual_cpc c.campaign_budget = campaign_budget_resource_name c.contains_eu_political_advertising = :DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING end end mutate_operation2 = client.operation.mutate do |m| m.ad_group_operation = client.operation.create_resource.ad_group do |ag| ag.name = "Bulk Mutate Ad Group" ag.campaign = temp_campaign_resource_name ag.status = :ENABLED end end response = client.service.google_ads.mutate( customer_id: customer_id, mutate_operations: [mutate_operation1, mutate_operation2] ) response.mutate_operation_responses.each do |op_response| result = op_response.send(op_response.response) puts "Created #{op_response.response}: #{result.resource_name}" end
Atomicité et échec partiel
Par défaut, les opérations d'une requête GoogleAdsService.Mutate s'exécutent de manière atomique : toutes les opérations réussissent ensemble, ou la requête entière échoue si une opération contient une erreur.
Comme les services de ressources individuels, ce point de terminaison accepte les options suivantes :
- Échec partiel (
partial_failure = true) : valide les opérations valides et renvoie des erreurs pour les opérations ayant échoué danspartial_failure_error. - Mode de validation (
validate_only = true) : vérifie si les opérations comportent des erreurs sans appliquer les modifications au compte :- Opérations de modification de ressources : ne renvoie que les erreurs de validation et omet les résultats.
- Opérations d'action : renvoie le résultat de l'action (par exemple,
quote_campaigns_resultoubook_campaigns_result) lorsque la validation réussit. Si des erreurs de validation se produisent, le résultat de l'action est omis deMutateOperationResponse(bien qu'un devis puisse toujours être renvoyé dansErrorDetails.reservation_error_details). Notez quequote_campaigns_operationnécessitevalidate_only = trueetpartial_failure = false.