En la API de Google Ads, algunos campos de mensajes se usan para indicar una elección de
estrategia de ofertas para un Campaign.
Estos pueden ser los siguientes:
- Mensajes verdaderamente vacíos: Por ejemplo,
campaign.manual_cpmno tiene subcampos definidos. - Mensajes con campos opcionales: Por ejemplo,
campaign.manual_cpctiene el subcampo opcionalenhanced_cpc_enabled.
Ten en cuenta que los campos de la estrategia de ofertas en Campaign pertenecen
a un grupo bidding_strategy oneof. Establecer una estrategia de ofertas nueva, como
manual_cpm o manual_cpc, borra de forma implícita cualquier estrategia de ofertas
configurada anteriormente en ese grupo de oneof.
Para actualizar un campo primitivo, como
campaign.name, debes configurarlo directamente:
campaign.name = "Test campaign value"
Para actualizar un mensaje anidado con subcampos configurables, como campaign.manual_cpc
cuando habilitas el CPC avanzado, configúralo de la siguiente manera:
campaign.manual_cpc.enhanced_cpc_enabled = True
Establece mensajes realmente vacíos
Para usar una estrategia de ofertas como manual_cpm, que es un mensaje vacío, haz lo siguiente:
- Obtén una instancia vacía del tipo de mensaje (
ManualCpm). - Usa
client.copy_frompara asignar esta instancia vacía al campo de la campaña. - Agrega manualmente el nombre del campo (
manual_cpm) alupdate_masken elCampaignOperation. El asistente de máscara de campo no puede detectar automáticamente que se estableció de forma explícita un mensaje vacío.
from google.ads.googleads import util
from google.ads.googleads.client import GoogleAdsClient
from google.api_core.protobuf_helpers import field_mask
client = GoogleAdsClient.load_from_storage()
# Assume 'campaign' is an existing Campaign object you are updating.
# 1. Get an empty ManualCpm type.
empty_cpm = client.get_type("ManualCpm")
# 2. Copy it to the campaign's manual_cpm field.
client.copy_from(campaign.manual_cpm, empty_cpm)
# 3. Create the operation and manually add "manual_cpm" to the update_mask.
campaign_operation = client.get_type("CampaignOperation")
client.copy_from(campaign_operation.update, campaign)
client.copy_from(
campaign_operation.update_mask,
field_mask(None, util.convert_proto_plus_to_protobuf(campaign)),
)
campaign_operation.update_mask.paths.append("manual_cpm")
# The resulting proto sent to the API will include:
# manual_cpm {
# }
Establece mensajes con subcampos opcionales
Para usar manual_cpc como la estrategia de ofertas sin habilitar enhanced_cpc_enabled, puedes probar un enfoque similar a ManualCpm. Sin embargo, como ManualCpc tiene
subcampos, agregar manual_cpc a update_mask genera un
error FieldMaskError.FIELD_HAS_SUBFIELDS. La API
requiere más especificidad cuando un mensaje en la máscara tiene subcampos.
Para configurar campaign.manual_cpc de forma correcta y, al mismo tiempo, asegurarte de que enhanced_cpc_enabled permanezca sin configurar, haz lo siguiente:
- Crea una instancia de un objeto
ManualCpcvacío y cópialo encampaign.manual_cpcconclient.copy_from. - Agrega de forma manual la ruta de acceso a cada subcampo mutable de
ManualCpca laupdate_masken laCampaignOperation. En este caso, el subcampo relevante esenhanced_cpc_enabled.
from google.ads.googleads import util
from google.ads.googleads.client import GoogleAdsClient
from google.api_core.protobuf_helpers import field_mask
client = GoogleAdsClient.load_from_storage()
# Assume 'campaign' is an existing Campaign object you are updating.
# 1. Copy an empty ManualCpc object into campaign.manual_cpc.
client.copy_from(campaign.manual_cpc, client.get_type("ManualCpc"))
# 2. Manually add the subfield path to the update_mask.
campaign_operation = client.get_type("CampaignOperation")
client.copy_from(campaign_operation.update, campaign)
client.copy_from(
campaign_operation.update_mask,
field_mask(None, util.convert_proto_plus_to_protobuf(campaign)),
)
# For ManualCpc, because it has subfields, you must specify the subfield
# path in the update_mask. This tells the API you are updating something
# within manual_cpc. By not setting enhanced_cpc_enabled on the campaign
# object, it defaults to false.
campaign_operation.update_mask.paths.append("manual_cpc.enhanced_cpc_enabled")
# The update_mask paths will include: ['manual_cpc.enhanced_cpc_enabled']
# This correctly signals to the API that ManualCpc is the chosen strategy,
# with enhanced_cpc_enabled in its default state.
Cuando envíes solicitudes con estos patrones, puedes verificar la carga útil habilitando el registro y, luego, inspeccionando la solicitud.