في Google Ads API، يتم إجراء التعديلات باستخدام قناع حقل. يحتوي قناع الحقل (google.protobuf.FieldMask) على قائمة بمسارات الحقول في snake_case التي تريد تغييرها باستخدام التعديل. يتم تجاهل أي حقول محددة غير مضمّنة في قناع الحقل، حتى إذا تم إرسالها إلى الخادم.
أداة FieldMasks
الطريقة المقترَحة لإنشاء أقنعة الحقول في مكتبة عميل Java هي استخدام فئة الأداة المساعدة FieldMasks المضمّنة، والتي تتيح لك إنشاء أقنعة الحقول من عنصر معدَّل بدلاً من إنشائها من البداية.
في ما يلي مثال على تعديل حملة:
// Creates a Campaign object with the proper resource name and any other
// changes.
Campaign campaign =
Campaign.newBuilder()
.setResourceName(ResourceNames.campaign(customerId, campaignId))
.setStatus(CampaignStatus.PAUSED)
.build();
// Constructs an operation that updates the campaign, using the
// FieldMasks.allSetFieldsOf utility to derive the update mask. This mask tells
// the Google Ads API which attributes of the campaign you want to change.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaign)
.setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
.build();
// Sends the operation in a mutate request.
MutateCampaignsResponse response =
campaignServiceClient.mutateCampaigns(
customerId.toString(), Collections.singletonList(operation));
ينشئ هذا المثال أولاً أداة إنشاء Campaign فارغة ويضبط اسم المورد الخاص بها لكي تعرف واجهة برمجة التطبيقات الحملة التي يتم تعديلها.
يستدعي المثال بعد ذلك FieldMasks.allSetFieldsOf() في الحملة لإنشاء قناع حقل تلقائيًا يدرج جميع الحقول التي تم ضبطها. يمكنك تمرير قناع العرض الذي تم إرجاعه مباشرةً إلى طلب التعديل.
إذا كنت بحاجة إلى العمل مع عنصر حالي وتعديل بعض الحقول، استخدِم
FieldMasks.compare() على النحو التالي:
// Assumes existingCampaign was retrieved from a previous API call.
// Creates a new campaign based on the existing campaign and updates the
// campaign by setting its status to paused.
Campaign campaignToUpdate =
existingCampaign.toBuilder()
.setStatus(CampaignStatus.PAUSED)
.build();
// Constructs an operation that updates the campaign, using the
// FieldMasks.compare utility to derive the update mask. This mask tells the
// Google Ads API which attributes of the campaign you want to change.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaignToUpdate)
.setUpdateMask(FieldMasks.compare(existingCampaign, campaignToUpdate))
.build();
// Sends the operation in a mutate request.
MutateCampaignsResponse response =
campaignServiceClient.mutateCampaigns(
customerId.toString(), Collections.singletonList(operation));
لإنشاء قناع حقل من البداية، أنشئ أداة إنشاء FieldMask
وأضِف اسم snake_case لكل حقل تريد تغييره:
FieldMask fieldMask =
FieldMask.newBuilder()
.addPaths("status")
.addPaths("name")
.build();
تعديل حقول الرسائل وحقولها الفرعية
يمكن أن تتضمّن حقول MESSAGE حقولاً فرعية (مثل MaximizeConversions الذي يتضمّن target_cpa_micros وcpc_bid_ceiling_micros وcpc_bid_floor_micros)، أو يمكن ألا تتضمّن حقولاً فرعية (مثل ManualCpm).
حقول الرسائل التي لا تحتوي على حقول فرعية محدّدة
عند تعديل حقل MESSAGE غير محدّد بأي حقول فرعية، استخدِم الأداة FieldMasks لإنشاء قناع حقل، كما هو موضّح في القسم السابق.
حقول الرسائل التي تتضمّن حقولاً فرعية محدّدة
عند تعديل حقل MESSAGE يتضمّن حقولاً فرعية محدّدة بدون ضبط أي من الحقول الفرعية في تلك الرسالة بشكل صريح، عليك إضافة كل الحقول الفرعية القابلة للتعديل MESSAGE إلى FieldMask يدويًا، على غرار إنشاء قناع حقل من البداية.
أحد الأمثلة الشائعة هو تعديل استراتيجية عروض الأسعار في حملة (الحقل oneof
campaign_bidding_strategy) بدون ضبط أي من الحقول في استراتيجية عروض الأسعار الجديدة. يوضّح المثال التالي كيفية تعديل حملة لاستخدام استراتيجية عروض الأسعار MaximizeConversions بدون ضبط أي من الحقول الفرعية في استراتيجية عروض الأسعار.
في هذه الحالة، لن يؤدي استخدام الطريقتَين allSetFieldsOf() وcompare() من FieldMasks وحدهما إلى تحقيق الهدف المنشود.
ينشئ المثال التالي قناع حقل يتضمّن
maximize_conversions. ومع ذلك، لا تسمح Google Ads API بمسارات الرسائل ذات المستوى الأعلى التي تحتوي على حقول فرعية في قناع التعديل (لمنع محو الحقول الفرعية عن طريق الخطأ)، وتعرض الخطأ FieldMaskError.FIELD_HAS_SUBFIELDS.
// Creates a campaign with the proper resource name and an empty
// MaximizeConversions field.
Campaign campaign =
Campaign.newBuilder()
.setResourceName(ResourceNames.campaign(customerId, campaignId))
.setMaximizeConversions(MaximizeConversions.newBuilder().build())
.build();
// Constructs an operation using FieldMasks.allSetFieldsOf to derive the update
// mask. The field mask includes 'maximize_conversions', which produces a
// FieldMaskError.FIELD_HAS_SUBFIELDS error.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaign)
.setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
.build();
// Sends the operation in a mutate request that results in a
// FieldMaskError.FIELD_HAS_SUBFIELDS error because empty MESSAGE fields with
// subfields cannot be included directly in a field mask.
MutateCampaignsResponse response =
campaignServiceClient.mutateCampaigns(
customerId.toString(), Collections.singletonList(operation));
يوضّح المثال التالي كيفية تعديل حملة بشكلٍ سليم لاستخدام استراتيجية عروض الأسعار MaximizeConversions بدون ضبط أيّ من الحقول الفرعية.
مزيد من المعلومات عن تعيين استراتيجيات عروض الأسعار العادية واستراتيجيات المحفظة
// Creates a Campaign object with the proper resource name.
Campaign campaign =
Campaign.newBuilder()
.setResourceName(ResourceNames.campaign(customerId, campaignId))
.build();
// Creates a field mask from the campaign and adds the mutable subfield
// ('maximize_conversions.target_cpa_micros') on the MaximizeConversions
// bidding strategy to the field mask. Because this subfield is included in the
// field mask while excluded from the campaign object, the Google Ads API
// switches the campaign's bidding strategy oneof to MaximizeConversions with
// target_cpa_micros unset.
FieldMask fieldMask =
FieldMasks.allSetFieldsOf(campaign).toBuilder()
.addPaths("maximize_conversions.target_cpa_micros")
.build();
// Creates an operation to update the campaign with the specified fields.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaign)
.setUpdateMask(fieldMask)
.build();
محو الحقول
يمكن محو بعض الحقول بشكل صريح. على غرار المثال السابق، يجب إضافة هذه الحقول بشكل صريح إلى قناع الحقل مع تركها غير مضبوطة في عنصر الرسالة. على سبيل المثال، لنفترض أنّ لديك حملة تستخدم استراتيجية عروض أسعار MaximizeConversions وأنّه تم ضبط الحقل target_cpa_micros بقيمة أكبر من 0.
يتم تنفيذ الرمز التالي، ولكن لن تتم إزالة maximize_conversions.target_cpa_micros كما هو متوقّع:
// Creates a campaign with the proper resource name and a MaximizeConversions
// object with target_cpa_micros set to 0L.
Campaign campaign =
Campaign.newBuilder()
.setResourceName(ResourceNames.campaign(customerId, campaignId))
.setMaximizeConversions(
MaximizeConversions.newBuilder().setTargetCpaMicros(0L).build())
.setStatus(CampaignStatus.PAUSED)
.build();
// Constructs an operation using FieldMasks.allSetFieldsOf to derive the
// update mask.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaign)
.setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
.build();
// Sends the operation in a mutate request that does not clear the field
// cleanly.
MutateCampaignsResponse response =
campaignServiceClient.mutateCampaigns(
customerId.toString(), Collections.singletonList(operation));
يوضّح المثال التالي كيفية محو الحقل target_cpa_micros بشكلٍ سليم في استراتيجية عروض الأسعار MaximizeConversions.
// Creates a Campaign object with the proper resource name.
Campaign campaign =
Campaign.newBuilder()
.setResourceName(ResourceNames.campaign(customerId, campaignId))
.build();
// Constructs a field mask from the campaign and adds the
// 'maximize_conversions.target_cpa_micros' field to the field mask, which
// clears this field from the bidding strategy without impacting any other
// fields on the bidding strategy.
FieldMask fieldMask =
FieldMasks.allSetFieldsOf(campaign).toBuilder()
.addPaths("maximize_conversions.target_cpa_micros")
.build();
// Creates an operation to update the campaign with the specified field.
CampaignOperation operation =
CampaignOperation.newBuilder()
.setUpdate(campaign)
.setUpdateMask(fieldMask)
.build();