Leere Nachrichtenobjekte als Felder festlegen

In der Google Ads API werden einige Nachrichtenfelder als leere Nachrichtenobjekte wie campaign.manual_cpm definiert. Es kann auch sein, dass sie nur optionale Felder enthalten, die nicht festgelegt werden müssen, z. B. campaign.manual_cpc. Das Festlegen dieser Felder ist wichtig, um der API mitzuteilen, welche Gebotsstrategie für die jeweilige Kampagne verwendet werden soll. Sollte die Nachricht leer sein, ist dies jedoch nicht intuitiv.

Wenn Sie das Feld campaign.name (einen String) aktualisieren, setzen Sie es direkt so, als ob es ein normales Python-Objektattribut wäre:

campaign.name = "Test campaign value"

campaign.manual_cpc ist ein verschachteltes Feld, d. h., es enthält eine andere Protokollzwischenspeicher-Protokollnachricht und keinen einfachen Typ, z. B. einen String. Sie können die zugehörigen Felder auch direkt aktualisieren:

campaign.manual_cpc.enhanced_cpc_enabled = True

Dadurch wird der API mitgeteilt, dass für diese Kampagne die Gebotsstrategie manual_cpc mit aktiviertem auto-optimiertem CPC aktiviert ist.

Aber was ist, wenn Sie manual_cpm verwenden möchten, das leer ist? Oder manual_cpc, ohne den auto-optimierten CPC zu aktivieren? Kopieren Sie dazu eine separate leere Instanz der Klasse in die Kampagne. Beispiel:

client = GoogleAdsClient.load_from_storage()

empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)

Beachten Sie, wie manual_cpm für das campaign-Objekt angegeben wird:

name {
  value: "Test campaign value"
}
manual_cpm {
}

Das Feld manual_cpm ist festgelegt, aber keines der Felder enthält Werte. Wenn Sie eine Anfrage an die API senden, die dieses Muster verwendet, können Sie prüfen, ob Sie das leere Nachrichtenobjekt korrekt festlegen, indem Sie Logging aktivieren und die Nutzlast der Anfrage prüfen.

Abschließend müssen Sie dieses Feld manuell dem update_mask des Anfrageobjekts hinzufügen. Der Feldmasken-Assistent hat keinen Mechanismus, um den Unterschied zwischen einem Feld, das explizit auf ein leeres Objekt festgelegt wurde, und einem nicht festgelegten Feld zu bestimmen.

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")