หน้ากากภาคสนาม

ใน 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 เพื่อให้ API ทราบว่ากำลังอัปเดตแคมเปญใด

ตัวอย่างนี้ใช้เมธอด 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 เทียบเท่ากับ protobuf 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),
  });

โปรดทราบว่าฟิลด์ที่มีฟิลด์ย่อยที่ซ้อนกันจะล้างได้โดยการล้างฟิลด์ย่อยแต่ละรายการเท่านั้น ดังที่แสดงในฟิลด์ออบเจ็กต์ที่มีฟิลด์ย่อยที่กำหนดไว้