Definir objetos de mensagem vazios como campos

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

Observe que os campos de estratégia de lances em Campaign pertencem a um grupo bidding_strategy oneof. A definição de uma nova estratégia de lances, como manual_cpm ou manual_cpc, limpa implicitamente qualquer estratégia de lances configurada anteriormente nesse grupo oneof.

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) à update_mask na CampaignOperation. O auxiliar de máscara de campo não pode detectar automaticamente que uma mensagem vazia foi definida explicitamente.
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 {
# }

Definir mensagens com subcampos opcionais

Para usar manual_cpc como a estratégia de lances sem ativar enhanced_cpc_enabled, tente uma abordagem semelhante a ManualCpm. No entanto, como ManualCpc tem subcampos, a adição de manual_cpc à update_mask resulta em um FieldMaskError.FIELD_HAS_SUBFIELDS erro. 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 copie-o para campaign.manual_cpc usando client.copy_from.
  2. Adicione manualmente o caminho para cada subcampo mutável de ManualCpc ao update_mask no CampaignOperation. Nesse caso, o subcampo relevante é 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.

Ao enviar solicitações usando esses padrões, você pode verificar o payload ativando a geração de registros e inspecionando a solicitação.