أقنعة الحقل

في Google Ads API، يتم إجراء التعديلات باستخدام قناع حقل. يسرد قناع الحقل جميع الحقول التي تنوي تغييرها من خلال التعديل، ويتم تجاهل أي حقول محدّدة غير مضمّنة في قناع الحقل، حتى إذا تم إرسالها إلى الخادم.

أداة FieldMasks

الطريقة المقترَحة لإنشاء أقنعة الحقول هي استخدام أداة قناع الحقل المضمّنة (FieldMasks)، والتي تتيح لك إنشاء أقنعة الحقول من عنصر معدَّل بدلاً من إنشائها من البداية.

في ما يلي مثال على تعديل حملة:

use Google::Ads::GoogleAds::Utils::FieldMasks qw(all_set_fields_of field_mask);

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

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

ينشئ هذا المثال أولاً عنصر Campaign من خلال ضبط اسم المورد الخاص به باستخدام الأداة المساعدة ResourceNames، لكي تعرف واجهة برمجة التطبيقات الحملة التي يتم تعديلها.

يستخدم المثال طريقة FieldMasks::all_set_fields_of() في الحملة لإنشاء قناع حقل تلقائيًا يحدّد جميع الحقول التي تم ضبطها. يمكنك بعد ذلك تمرير القناع الذي تم عرضه مباشرةً إلى طلب التعديل.

‫FieldMasks::all_set_fields_of() هي طريقة ملائمة لـ FieldMasks::field_mask(). فهي تقارن الكائن الذي تم تمريره بكائن فارغ من نفس الفئة. في الرمز السابق، يمكنك أيضًا استخدام:

field_mask(
  Google::Ads::GoogleAds::V26::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"],
});

تعديل حقول الكائنات وحقولها الفرعية

يمكن أن تحتوي حقول العناصر على حقول فرعية (مثل MaximizeConversions، والتي تتضمّن حقولاً فرعية مثل target_cpa_micros)، أو يمكن ألا تحتوي على أي حقول فرعية (مثل ManualCpm).

حقول العناصر التي لا تحتوي على حقول فرعية محدّدة

يعادل حقل الكائن في Perl حقل MESSAGE في مخزن بروتوكولات مؤقت في مكتبات العملاء التي تعمل على gRPC. عند تعديل حقل عنصر غير محدّد بأي حقول فرعية، استخدِم الأداة المساعدة FieldMasks لإنشاء قناع حقل، كما هو موضّح في القسم السابق.

حقول العناصر التي تتضمّن حقولاً فرعية محدّدة

عند تعديل حقل عنصر تم تحديده باستخدام حقول فرعية بدون ضبط أي من الحقول الفرعية بشكل صريح في تلك الرسالة، يجب إضافة كل حقل من الحقول الفرعية للعنصر القابل للتغيير يدويًا إلى FieldMask، على غرار المثال السابق الذي ينشئ قناع حقل من البداية.

ومن الأمثلة الشائعة تعديل استراتيجية عروض أسعار حملة معيّنة بدون ضبط أيّ من الحقول في استراتيجية عروض الأسعار الجديدة. يوضّح المثال التالي كيفية تعديل حملة لاستخدام استراتيجية عروض الأسعار MaximizeConversions بدون ضبط أيّ من الحقول الفرعية في استراتيجية عروض الأسعار.

في هذه الحالة، لن يؤدي استخدام الطريقتَين all_set_fields_of() وfield_mask() في الأداة المساعدة FieldMasks إلى تحقيق الهدف المنشود.

ينشئ المثال التالي قناع حقل يتضمّن 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::V26::Resources::Campaign->new({
    resourceName =>
      Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
    maximizeConversions =>
      Google::Ads::GoogleAds::V26::Resources::MaximizeConversions
      ->new(),
  });

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

# Sends the operation in a mutate request that results 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::V26::Resources::Campaign->new({
    resourceName =>
      Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
  });

# Creates a field mask from the existing campaign and adds the mutable subfield
# on the MaximizeConversions bidding strategy to the field mask. Because this
# field is included in the field mask but excluded from the campaign object,
# the Google Ads API sets 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.
#
# See the guide on assigning standard and portfolio bidding strategies
# (/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::V26::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::V26::Resources::Campaign->new({
    resourceName =>
      Google::Ads::GoogleAds::V26::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      ),
    maximizeConversions =>
      Google::Ads::GoogleAds::V26::Resources::MaximizeConversions
      ->new({
        targetCpaMicros => 0,
      }),
  });

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

يُرجى العِلم أنّه لا يمكن محو الحقول التي تحتوي على حقول فرعية مدمجة إلا من خلال محو كل حقل من الحقول الفرعية الفردية، كما هو موضّح في حقول العناصر التي تحتوي على حقول فرعية محدّدة.