ב-Google Ads API, העדכונים מתבצעים באמצעות מסכת שדה. במסכת השדות מפורטים כל השדות שאתם מתכוונים לשנות באמצעות העדכון, וכל שדה שצוין ולא נכלל במסכת השדות יידחה, גם אם הוא נשלח לשרת.
FieldMaskUtil
הדרך המומלצת ליצור מסכות שדות היא באמצעות הכלי המובנה שלנו למסכות שדות, שמאפשר ליצור מסכות שדות מאובייקט שעבר שינוי במקום ליצור אותן מאפס.
דוגמה לעדכון קמפיין:
// Update campaign by setting its status to paused, and "Search network" to false.
Campaign campaignToUpdate = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
Status = CampaignStatus.Paused,
NetworkSettings = new NetworkSettings()
{
TargetSearchNetwork = false
}
};
// Create the operation.
CampaignOperation operation = new CampaignOperation()
{
Update = campaignToUpdate,
UpdateMask = FieldMasks.AllSetFieldsOf(campaignToUpdate)
};
// Update the campaign.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
קודם יוצרים אובייקט Campaign
ריק. לאחר מכן, מגדירים את שם המשאב כדי שה-API ידע בדיוק איזה קמפיין אנחנו מעדכנים.
בדוגמה הזו נעשה שימוש בשיטה FieldMasks.AllSetFieldsOf
בקמפיין כדי ליצור באופן אוטומטי מסכת שדה שמפרטת את כל השדות שהוגדרו. לאחר מכן תוכלו להעביר את המסכה שהוחזרה ישירות לקריאה לעדכון.
לפעמים צריך לעבוד עם אובייקט קיים ולעדכן כמה שדות. במקרים כאלה, צריך לשנות את הקוד באופן הבא:
Campaign existingCampaign;
// Obtain existingCampaign from elsewhere.
...
// Create a new campaign based off the existing campaign for update.
Campaign campaignToUpdate = new Campaign(existingCampaign);
// Update campaign by setting its status to paused, and "Search network" to
// false.
campaignToUpdate.Status = CampaignStatus.Paused;
campaignToUpdate.NetworkSettings = new NetworkSettings()
{
TargetSearchNetwork = false
}
// Create the operation.
CampaignOperation operation = new CampaignOperation()
{
Update = campaignToUpdate,
UpdateMask = FieldMasks.FromChanges(existingCampaign, campaignToUpdate)
};
כדי ליצור מסכת שדה מאפס, קודם יוצרים אובייקט FieldMask
, אחר כך יוצרים מערך שמאוכלס בשמות של כל השדות שרוצים לשנות, ולבסוף מוסיפים את תוכן המערך לשדה Path
של מסכת השדה.
FieldMask fieldMask = new FieldMask();
fieldMask.Paths.AddRange(new string[] { "status", "name" });
עדכון שדות ההודעה ושדות המשנה שלהם
לשדות MESSAGE
יכולים להיות שדות משנה (למשל, MaximizeConversions
שיש לו שלושה: target_cpa_micros
, cpc_bid_ceiling_micros
ו-cpc_bid_floor_micros
), או שאין להם שדות משנה בכלל (למשל, ManualCpm
).
שדות של הודעות ללא שדות משנה מוגדרים
כשמעדכנים שדה MESSAGE
שלא מוגדר עם שדות משנה, משתמשים ב-FieldMasks
כדי ליצור מסכת שדה, כפי שמתואר למעלה.
שדות של הודעות עם שדות משנה מוגדרים
כשמעדכנים שדה MESSAGE
שמוגדר עם שדות משנה בלי להגדיר באופן מפורש אף אחד משדות המשנה בהודעה, צריך להוסיף ידנית את כל שדות המשנה הניתנים לשינוי של MESSAGE
אל FieldMask
, בדומה לדוגמה שלמעלה שבה נוצר מסכת שדה מאפס.
דוגמה נפוצה לכך היא עדכון שיטת הבידינג של קמפיין בלי להגדיר אף אחד מהשדות בשיטת הבידינג החדשה. בדוגמה הבאה מוסבר איך לעדכן קמפיין כך שישתמש בשיטת הבידינג MaximizeConversions
בלי להגדיר אף אחד משדות המשנה של שיטת הבידינג.
במקרה כזה, השימוש בשיטות AllSetFieldsOf()
ו-FromChanges()
של 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 = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
MaximizeConversions = new MaximizeConversions()
};
// Constructs an operation, using the FieldMasks' AllSetFieldsOf utility to
// derive the update mask. The field mask will include 'maximize_conversions`,
// which will produce a FieldMaskError.FIELD_HAS_SUBFIELDS error.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
// 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.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
בדוגמה הבאה מוסבר איך לעדכן כראוי קמפיין כך שישתמש בשיטת הבידינג MaximizeConversions
בלי להגדיר אף אחד משדות המשנה שלה.
// Creates a Campaign object with the proper resource name.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
};
// Creates a field mask from the existing campaign and adds all of the fields
// on the MaximizeConversions bidding strategy to the field mask. Because these
// fields are included in the field mask but excluded from the campaign object,
// the Google Ads API will set the campaign's bidding strategy to a
// MaximizeConversions object with none of its subfields set.
FieldMask fieldMask = FieldMasks.AllSetFieldsOf(campaign);
// 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.
//
// Learn more about standard and portfolio bidding strategies here:
// https://developers.google.com/google-ads/api/docs/campaigns/bidding/assign-strategies
fieldMask.Paths.AddRange(new string[] {
"maximize_conversions.target_cpa_micros",
});
// Creates an operation to update the campaign with the specified fields.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
ניקוי שדות
אפשר לנקות שדות מסוימים באופן מפורש. בדומה לדוגמה שלמעלה, צריך להוסיף את השדות האלה באופן מפורש למסכת השדות. לדוגמה, נניח שיש לכם קמפיין שבו מוגדרת שיטת בידינג מסוג MaximizeConversions
וששדה target_cpa_micros
מוגדר לערך גבוה מ-0.
הקוד הבא פועל, אבל השדה maximize_conversions.target_cpa_micros
לא יתווסף למסיכת השדה, ולכן לא יבוצעו שינויים בשדה target_cpa_micros
:
// Creates a campaign with the proper resource name and a MaximizeConversions
// object with target_cpa_micros set to 0.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
MaximizeConversions = new MaximizeConversions()
{
TargetCpaMicros = 0
}
};
// Constructs an operation, using the FieldMasks' AllSetFieldsOf utility to
// derive the update mask. However, the field mask will NOT include
// 'maximize_conversions.target_cpa_micros'.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = FieldMasks.AllSetFieldsOf(campaign)
};
// Sends the operation in a mutate request that will succeed but will NOT update
// the 'target_cpa_micros' field because 'maximize_conversions.target_cpa_micros'
// was not included in the field mask.
MutateCampaignsResponse response = campaignService.MutateCampaigns(
customerId.ToString(), new CampaignOperation[] { operation });
בדוגמה הבאה מוסבר איך למחוק בצורה נכונה את השדה target_cpa_micros
בשיטת הבידינג MaximizeConversions
.
// Creates a Campaign object with the proper resource name.
Campaign campaign = new Campaign()
{
ResourceName = ResourceNames.Campaign(customerId, campaignId),
};
// Constructs a field mask from the existing campaign and adds the
// 'maximize_conversions.target_cpa_micros' field to the field mask, which will
// clear this field from the bidding strategy without impacting any other fields
// on the bidding strategy.
FieldMask fieldMask = FieldMasks.AllSetFieldsOf(campaign);
fieldMask.Paths.AddRange(new string[] {
"maximize_conversions.target_cpa_micros",
});
// Creates an operation to update the campaign with the specified field.
CampaignOperation operation = new CampaignOperation()
{
Update = campaign,
UpdateMask = fieldMask
};
שימו לב שהדוגמה 'השגויה' שלמעלה פועלת כמצופה בשדות שמוגדרים בתור optional
ב-Google Ads API protocol buffers
.
עם זאת, מכיוון ש-target_cpa_micros
הוא לא שדה optional
, הדוגמה 'שגויה' לא מעדכנת את שיטת הבידינג כדי לנקות את השדה target_cpa
.