Definir objetos de mensagem vazios como campos

Na API Google Ads, alguns campos de mensagem são usados para indicar uma opção de estratégia de lances para uma campanha. Eles podem ser:

Para atualizar um campo primitivo como campaign.name, defina-o diretamente:

campaign.name = "Test campaign value"

Para atualizar uma mensagem aninhada com subcampos definíveis, como campaign.manual_cpc ao ativar o CPC otimizado, defina-o da seguinte maneira:

campaign.manual_cpc.enhanced_cpc_enabled = True

Definir mensagens realmente vazias

Para usar uma estratégia de lances como manual_cpm, que é uma mensagem vazia:

  1. Receba uma instância vazia do tipo de mensagem (ManualCpm).
  2. Use client.copy_from para atribuir essa instância vazia ao campo da campanha.
  3. Adicione manualmente o nome do campo (manual_cpm) ao update_mask no CampaignOperation. O ajudante de máscara de campo não consegue detectar automaticamente que uma mensagem vazia foi definida explicitamente.
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. Manually add "manual_cpm" to the update_mask.
from google.api_core.protobuf_helpers import field_mask
campaign_operation = client.get_type('CampaignOperation')
campaign_operation.update = campaign
campaign_operation.update_mask = field_mask(None, campaign)
campaign_operation.update_mask.paths.append("manual_cpm")

# The resulting proto sent to the API will include:
# manual_cpm {
# }

Definir mensagens com subcampos opcionais

Para usar manual_cpc como estratégia de lances sem ativar enhanced_cpc_enabled, tente uma abordagem semelhante a ManualCpm. No entanto, como ManualCpc tem subcampos, adicionar manual_cpc ao update_mask resulta em um erro de FieldMaskError.FIELD_HAS_SUBFIELDS. A API exige mais especificidade quando uma mensagem na máscara tem subcampos.

Para definir corretamente campaign.manual_cpc e garantir que enhanced_cpc_enabled permaneça indefinido:

  1. Instancie um objeto ManualCpc vazio e atribua-o a campaign.manual_cpc.
  2. Adicione manualmente o caminho a cada subcampo mutável de ManualCpc ao update_mask no CampaignOperation. Nesse caso, o subcampo relevante é enhanced_cpc_enabled.
client = GoogleAdsClient.load_from_storage()
# Assume 'campaign' is an existing Campaign object you are updating.

# 1. Instantiate and assign an empty ManualCpc
campaign.manual_cpc = client.get_type('ManualCpc')

# 2. Manually add the subfield path to the update_mask.
from google.api_core.protobuf_helpers import field_mask
campaign_operation = client.get_type('CampaignOperation')
campaign_operation.update = campaign
campaign_operation.update_mask = field_mask(None, 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.

Ao enviar solicitações usando esses padrões, é possível verificar o payload ativando o registro em log e inspecionando a solicitação.