إشعارات باستخدام أقنعة الحقول

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

FieldMaskUtil

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

في ما يلي كيفية إنشاء قناع حقل لتعديل إحدى الحملات:

campaign = client.resource.campaign
campaign.resource_name = client.path.campaign(customer_id, campaign_id)

mask = client.field_mask.with campaign do
  campaign.status = :PAUSED
  campaign.network_settings = client.resource.network_settings do |ns|
    ns.target_search_network = false
  end
end

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

يستخدم هذا المثال طريقة client.field_mask.with في الحملة للبدء. الكتلة التي تتضمن التحديثات. في نهاية هذه القطعة، تقوم الأداة يقارن الحالة الحالية للحملة بعد الحظر بالحالة الأولية حالة الحملة قبل الحظر، ويتم إنشاء حقل تلقائيًا بقناع لتعداد الحقول التي تم تغييرها. يمكنك توفير قناع الحقل هذا عند إنشائه لاستدعاء mutate على النحو التالي:

operation = client.operation.campaign
operation.update = campaign
operation.update_mask = mask

ويوصى باستخدام هذه الطريقة عند إجراء عملية معقدة ويريدون التحكم الدقيق في كل خطوة. ومع ذلك، يمكنك في معظم الحالات استخدام أداة مكتبة Ruby أبسط:

operation = client.operation.update_resource.campaign do |c|
  c.status = :PAUSED
  c.network_settings = client.resource.network_settings do |ns|
    ns.target_search_network = false
  end
end

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

إنشاء قناع يدويًا

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

mask = Google::Protobuf::FieldMask.new
mask.path = ["status", "name"]

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

يمكن أن يحتوي حقلان (MESSAGE) على حقول فرعية (مثل MaximizeConversions التي تتضمن ثلاثة: target_cpa_micros وcpc_bid_ceiling_micros وcpc_bid_floor_micros) أو ولا يمكن أن تحتوي على أي منها على الإطلاق (مثل ManualCpm).

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

عند تعديل حقل MESSAGE غير معرّف مع أي حقول فرعية، يمكنك استخدام السمة لإنشاء قناع حقل، كما تم تقديمه سابقًا،

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

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

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

في هذا المثال، لا ينطبق استخدام المقارنة المضمنة لـ FieldMaskUtil وتحقيق الهدف المنشود.

ينشئ الرمز التالي قناع حقل يتضمّن maximize_conversions. ومع ذلك، لا تسمح Google Ads API بهذا السلوك لمنع تقوم بمسح الحقول عن طريق الخطأ وينتج FieldMaskError.FIELD_HAS_SUBFIELDS خطأ.

# Creates a campaign with the proper resource name.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
end

# Update the maximize conversions field within the update block, so it's
# captured in the field mask
operation = client.operation.update_resource.campaign(campaign) do |c|
  c.maximize_conversions = client.resource.maximize_conversions
end

# Sends the operation in a mutate request that will result in a
# FieldMaskError.FIELD_HAS_SUBFIELDS error because empty MESSAGE fields cannot
# be included in a field mask.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
)

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

# Create the operation directly from the campaign's resource name. Don't do
# anything in the block so that the field mask is empty. You could modify other
# fields in this block, just not the message field that is intended to have a
# blank subfield. We'll add that below.
campaign_resource_name = client.path.campaign(customer_id, campaign_id)
operation = client.operation.update_resource.campaign(campaign_resource_name) {}

# Manually add the maximize conversions subfield to the field mask so the API
# knows to clear it.
operation.update_mask.paths << "maximize_conversions.target_cpa_micros"

# This operation succeeds.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
)

جارٍ محو الحقول

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

يتم تشغيل التعليمة البرمجية التالية؛ أمّا maximize_conversions.target_cpa_micros إلى قناع الحقل وبالتالي لا يتم إجراء أي تغييرات على الحقل target_cpa_micros:

# Create a campaign object representing the campaign you want to change.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
end

# The field mask in this operation will include 'maximize_conversions',
# but not 'maximize_conversions.target_cpa_micros', so it will result in an
# error.
operation = client.operation.update_resource.campaign(campaign) do |c|
  c.maximize_conversions = client.resource.maximize_conversions do |mc|
    mc.target_cpa_micros = 0
  end
end

# Operation will fail since field mask is incorrect.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
end

يوضح الرمز التالي كيفية محو target_cpa_micros بشكل صحيح على استراتيجية عروض أسعار MaximizeConversions.

# Create a campaign including the maximize conversions fields right away, since
# we're going to manually add them to the field mask.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
  c.maximize_conversions = client.resource.maximize_conversions do |mc|
    mc.target_cpa_micros = 0
  end
end

# Create the operation with an empty field mask. You may add a block here with
# other changes that will automatically get added to the field mask.
operation = client.operation.update_resource.campaign(campaign) {}

# Add the field to the field mask so the API knows to clear it.
operation.update_mask.paths << 'maximize_conversions.target_cpa_micros'

# Operation will succeed since we specified the correct field mask.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
end

لاحظ أن القيمة "غير صحيح" تعمل التعليمات البرمجية على النحو المنشود للحقول المحددة باسم optional في واجهة برمجة التطبيقات مع "إعلانات Google" protocol buffers. ولكن نظرًا لأن target_cpa_micros هو ليس حقل optional، فإن "غير صحيح" الرمز البرمجي لا يعدِّل عروض الأسعار الإستراتيجية لمحو حقل target_cpa.