Google Ads API では、一部のメッセージ フィールドは空のメッセージ オブジェクト(campaign.manual_cpm
など)として定義されます。また、設定する必要がないオプション フィールド(campaign.manual_cpc
など)のみが含まれる場合もあります。これらのフィールドの設定は、特定のキャンペーンに対してどの入札戦略を使用するかを API に伝えるために重要ですが、メッセージが空のときは直感的に理解できません。
文字列である campaign.name
フィールドを更新するときは、通常の Python オブジェクト属性であるかのように直接更新して、フィールドを設定します。
campaign.name = "Test campaign value"
campaign.manual_cpc
はネストされたフィールドです。つまり、文字列などのプリミティブ型ではなく、別の protobuf メッセージが含まれます。そのフィールドを直接更新することもできます。
campaign.manual_cpc.enhanced_cpc_enabled = True
これにより、このキャンペーンで拡張クリック単価が有効になっている入札戦略「manual_cpc
」が API に通知されます。
しかし、空の manual_cpm
を使用する場合はどうすればよいでしょうか。または、拡張クリック単価を有効にせずに manual_cpc
を行うことはできますか?そのためには、クラスの空のインスタンスをキャンペーンにコピーする必要があります。次に例を示します。
client = GoogleAdsClient.load_from_storage()
empty_cpm = client.get_type('ManualCpm')
client.copy_from(campaign.manual_cpm, empty_cpm)
campaign
オブジェクトに manual_cpm
がどのように指定されているかに注目してください。
name {
value: "Test campaign value"
}
manual_cpm {
}
manual_cpm
フィールドは設定されていますが、どのフィールドにも値がありません。このパターンを使用するリクエストを API に送信するときに、ロギングを有効にしてリクエスト ペイロードを調べることで、空のメッセージ オブジェクトが正しく設定されていることを確認できます。
最後に、このフィールドをリクエスト オブジェクトの update_mask
に手動で追加する必要があります。フィールド マスク ヘルパーには、空のオブジェクトに明示的に設定されているフィールドと設定されていないフィールドの違いを判断するメカニズムはありません。
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")