ב-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 מקביל ל-MESSAGE של protobuf בספריות לקוח שפועלות ב-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),
});
שימו לב: אפשר לנקות שדות עם שדות משנה מוטמעים רק על ידי ניקוי כל אחד משדות המשנה בנפרד, כמו שמוסבר במאמר שדות אובייקט עם שדות משנה מוגדרים.