フィールド マスク

Google Ads API では、フィールド マスクを使用して更新が行われます。フィールド マスクには、更新で変更するすべてのフィールドがリストされます。フィールド マスクに含まれていない指定されたフィールドは、サーバーに送信されても無視されます。

FieldMasks ユーティリティ

フィールド マスクを生成するおすすめの方法は、組み込みのフィールド マスク ユーティリティ(FieldMasks)を使用することです。これにより、フィールド マスクをゼロから構築するのではなく、変更されたオブジェクトから生成できます。

キャンペーンを更新する例を次に示します。

my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
    resourceName =>
      Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
    status => PAUSED,
    networkSettings =>
      Google::Ads::GoogleAds::V20::Resources::NetworkSettings->new({
        targetSearchNetwork => "false"
      })
    });

my $campaign_operation =
  Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
    update     => $campaign,
    updateMask => all_set_fields_of($campaign)
  });

この例では、まず ResourceNames ユーティリティを使用してリソース名を設定し、Campaign オブジェクトを作成します。これにより、API はどのキャンペーンが更新されているかを認識します。

この例では、キャンペーンで FieldMasks::all_set_fields_of() メソッドを使用して、設定されたすべてのフィールドを列挙するフィールド マスクを自動的に生成します。返されたマスクは、更新呼び出しに直接渡すことができます。

FieldMasks::all_set_fields_of() は、FieldMasks::field_mask() のコンビニエンス メソッドです。渡されたオブジェクトを同じクラスの空のオブジェクトと比較します。したがって、上記のコードでは、

field_mask(Google::Ads::GoogleAds::V20::Resources::Campaign->new({}), $campaign)

ではなく、all_set_fields_of($campaign) を使用します。

マスクを手動で作成する

フィールド マスクをゼロから作成するには、まず Google::Ads::GoogleAds::Common::FieldMask オブジェクトを作成し、変更するすべてのフィールドの名前が設定された配列参照を作成して、最後に配列参照をフィールド マスクの paths フィールドに割り当てます。

my $field_mask = Google::Ads::GoogleAds::Common::FieldMask->new({
    paths => ["status", "name"]
  });

オブジェクト フィールドとそのサブフィールドを更新する

オブジェクト フィールドにはサブフィールド(3 つのサブフィールド(target_cpa_microscpc_bid_ceiling_microscpc_bid_floor_micros)を持つ MaximizeConversions など)を含めることも、サブフィールドをまったく含めない(ManualCpm など)こともできます。

サブフィールドが定義されていないオブジェクト フィールド

Perl のオブジェクト フィールドは、gRPC で実行されているクライアント ライブラリの protobuf MESSAGE に相当します。サブフィールドで定義されていないオブジェクト フィールドを更新する場合は、上記のように FieldMasks ユーティリティを使用してフィールド マスクを生成します。

サブフィールドが定義されたオブジェクト フィールド

サブフィールドで定義されたオブジェクト フィールドを更新するときに、そのメッセージのサブフィールドを明示的に設定しない場合は、上記の例のように、変更可能なオブジェクト サブフィールドをそれぞれ FieldMask に手動で追加する必要があります。

一般的な例としては、新しい入札戦略のフィールドを何も設定せずに、キャンペーンの入札戦略を更新する場合などがあります。次の例は、入札戦略のサブフィールドを設定せずに、MaximizeConversions 入札戦略を使用するようにキャンペーンを更新する方法を示しています。

この場合、FieldMasks ユーティリティの all_set_fields_of() メソッドと field_mask() メソッドを使用しても、目的の目標を達成できません。

次の例では、maximize_conversions を含むフィールド マスクを生成します。ただし、Google Ads API では、フィールドの誤ったクリアを防ぐため、この動作は許可されておらず、FieldMaskError.FIELD_HAS_SUBFIELDS エラーが生成されます。

# Creates a campaign with the proper resource name and an empty
# MaximizeConversions field.
my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
    resourceName =>
      Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
    maximizeConversions =>
      Google::Ads::GoogleAds::V20::Resources::MaximizeConversions->new()
    });

# Constructs an operation, using the FieldMasks' all_set_fields_of utility to
# derive the update mask. The field mask will include 'maximize_conversions',
# which will produce a FieldMaskError.FIELD_HAS_SUBFIELDS error.
my $campaign_operation =
  Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
    update     => $campaign,
    updateMask => all_set_fields_of($campaign)
  });

# Sends the operation in a mutate request that will result in a
# FieldMaskError.FIELD_HAS_SUBFIELDS error because empty object fields cannot
# be included in a field mask.
my $response = $api_client->CampaignService()->mutate({
    customerId => $customer_id,
    operations => [$campaign_operation]
  });

次の例は、サブフィールドを設定せずに MaximizeConversions 入札戦略を使用するようにキャンペーンを適切に更新する方法を示しています。

# Creates a campaign with the proper resource name.
my $campaign = Google::Ads::GoogleAds::V20::Resources::Campaign->new({
    resourceName => Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
      $customer_id, $campaign_id
    )
  });

# Creates a field mask from the existing campaign and adds all of the fields
# on the MaximizeConversions bidding strategy to the field mask. Because these
# fields are included in the field mask but excluded from the campaign object,
# the Google Ads API will set the campaign's bidding strategy to a
# MaximizeConversions object with none of its subfields set.
# Only include 'maximize_conversions.target_cpa_micros' in the field mask
# as it is the only mutable subfield on MaximizeConversions when used as a
# standard bidding strategy.
#
# Learn more about standard and portfolio bidding strategies here:
# https://developers.google.com/google-ads/api/docs/campaigns/bidding/assign-strategies
my $field_mask = all_set_fields_of($campaign);
push @{$field_mask->{paths}}, "maximize_conversions.target_cpa_micros";

# Creates an operation to update the campaign with the specified fields.
my $campaign_operation =
  Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
    update     => $campaign,
    updateMask => $field_mask
  });

フィールドのクリア

フィールドを明示的にクリアするには、上記の例のようにフィールド マスクに追加するか、フィールドを空の値または未定義の値に設定します。たとえば、MaximizeConversions 入札戦略を使用するキャンペーンがあり、target_cpa_micros フィールドに 0 より大きい値が設定されているとします。

# Creates a campaign with the proper resource name and a MaximizeConversions
# object with target_cpa_micros set to 0.
my $campaign =
  Google::Ads::GoogleAds::V20::Resources::Campaign->new({
    resourceName => Google::Ads::GoogleAds::V20::Utils::ResourceNames::campaign(
      $customer_id, $campaign_id
    ),
    maximizeConversions => Google::Ads::GoogleAds::V20::Resources::MaximizeConversions->new({
      targetCpaMicros => 0
    })
  });

# Constructs an operation, using the FieldMasks' all_set_fields_of utility to
# derive the update mask, which will include 'maximize_conversions.target_cpa_micros'.
my $campaign_operation =
  Google::Ads::GoogleAds::V20::Services::CampaignService::CampaignOperation->new({
    update     => $campaign,
    updateMask => all_set_fields_of($campaign)
  });

ネストされたサブフィールドを含むフィールドは、サブフィールドが定義されたオブジェクト フィールドで説明されているように、個々のサブフィールドをクリアすることでのみクリアできます。