Establece objetos de mensaje vacíos como campos

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:

Ten en cuenta que los campos de la estrategia de ofertas en Campaign pertenecen a un grupo bidding_strategy oneof. Establecer una nueva estrategia de ofertas, como manual_cpm o manual_cpc, borra de forma implícita cualquier estrategia de ofertas configurada previamente en ese grupo de oneof.

Para actualizar un campo primitivo como campaign.name, configúralo directamente:

campaign.name = "Test campaign value"

Para actualizar un mensaje anidado con subcampos configurables, como campaign.manual_cpc cuando se habilita el CPC avanzado, configúralo de la siguiente manera:

campaign.manual_cpc.enhanced_cpc_enabled = True

Cómo establecer mensajes verdaderamente vacíos

Para usar una estrategia de ofertas como manual_cpm, que es un mensaje vacío, haz lo siguiente:

  1. Obtén una instancia vacía del tipo de mensaje (ManualCpm).
  2. Usa client.copy_from para asignar esta instancia vacía al campo de la campaña.
  3. Agrega manualmente el nombre del campo (manual_cpm) a update_mask en CampaignOperation. El asistente de máscara de campo no puede detectar automáticamente que se estableció explícitamente 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 {
# }

Cómo configurar mensajes con subcampos opcionales

Para usar manual_cpc como 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 de FieldMaskError.FIELD_HAS_SUBFIELDS. La API requiere más especificidad cuando un mensaje en la máscara tiene subcampos.

Para establecer campaign.manual_cpc correctamente y garantizar que enhanced_cpc_enabled permanezca sin establecer, haz lo siguiente:

  1. Crea una instancia de un objeto ManualCpc vacío y cópialo en campaign.manual_cpc con client.copy_from.
  2. Agrega manualmente la ruta de acceso a cada subcampo mutable de ManualCpc a update_mask en CampaignOperation. En este caso, el subcampo pertinente es enhanced_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.