Na API Google Ads, alguns campos de mensagem são definidos como objetos de mensagem vazios, como campaign.manual_cpm
, ou só podem ter campos opcionais que não precisam ser definidos, por exemplo, campaign.manual_cpc
.
A definição desses campos é importante para informar à API qual estratégia de lances usar
para a campanha, mas não é intuitivo quando as mensagens estão vazias.
Ao atualizar o campo campaign.name
, que é uma string, definimos o campo
atualizando-o diretamente como se fosse um atributo normal de objeto do Python:
campaign.name = "Test campaign value"
campaign.manual_cpc
é um campo aninhado, ou seja, ele contém
outra mensagem protobuf e não um tipo primitivo, como uma string. Também é possível atualizar os campos diretamente:
campaign.manual_cpc.enhanced_cpc_enabled = True
Isso vai informar à API que a campanha tem uma estratégia de lances de manual_cpc
com o CPC otimizado ativado.
Mas e se você quiser usar manual_cpm
, que fica vazio? Ou manual_cpc
sem ativar o CPC otimizado? Para fazer isso, copie uma instância vazia separada da classe para a campanha, por exemplo:
client = GoogleAdsClient.load_from_storage()
empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)
Observe como manual_cpm
é especificado para o objeto campaign
:
name {
value: "Test campaign value"
}
manual_cpm {
}
O campo manual_cpm
está definido, mas nenhum dos campos tem valores. Ao enviar
solicitações para a API que usam esse padrão, é possível verificar se você está definindo o
objeto de mensagem vazio corretamente ativando o registro e inspecionando o
payload da solicitação.
Por fim, é necessário adicionar manualmente esse campo ao update_mask
do objeto da solicitação. O auxiliar de máscara de campo não tem um mecanismo para determinar a
diferença entre um campo que foi explicitamente definido como um objeto vazio e um
que não foi definido.
from google.api_core.protobuf_helpers import field_mask
campaign_operation.create = campaign
campaign_operation.update_mask = field_mask(None, campaign)
# Here we manually add the "manual_cpm" field
campaign_operation.update_mask.append("manual_cpm")