Khẩu trang tại chỗ

Trong API Google Ads, việc cập nhật được thực hiện bằng cách sử dụng mặt nạ trường. Mặt nạ trường liệt kê tất cả các trường mà bạn dự định thay đổi bằng nội dung cập nhật và mọi trường được chỉ định không có trong mặt nạ trường sẽ bị bỏ qua, ngay cả khi được gửi đến máy chủ.

FieldMaskUtil

Bạn nên tạo mặt nạ trường bằng cách sử dụng tiện ích mặt nạ trường tích hợp sẵn. Tiện ích này cho phép bạn tạo mặt nạ trường từ một đối tượng đã sửa đổi thay vì tạo từ đầu.

Dưới đây là ví dụ về cách cập nhật chiến dịch:

// 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 });

Trước tiên, chúng ta tạo một đối tượng Campaign trống. Sau đó, chúng ta đặt tên tài nguyên để API biết chính xác chiến dịch mà chúng ta đang cập nhật.

Ví dụ này sử dụng phương thức FieldMasks.AllSetFieldsOf trên chiến dịch để tự động tạo một mặt nạ trường liệt kê tất cả các trường đã đặt. Sau đó, bạn có thể truyền trực tiếp mặt nạ được trả về đến lệnh gọi cập nhật.

Đôi khi, bạn có thể cần làm việc với một đối tượng hiện có và cập nhật một vài trường. Trong trường hợp như vậy, bạn sẽ sửa đổi mã như sau:

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)
};

Để tạo mặt nạ trường từ đầu, trước tiên, bạn sẽ tạo một đối tượng FieldMask, sau đó tạo một mảng được điền sẵn tên của tất cả các trường mà bạn dự định thay đổi, và cuối cùng, thêm nội dung mảng vào trường Path của mặt nạ trường.

FieldMask fieldMask = new FieldMask();
fieldMask.Paths.AddRange(new string[] { "status", "name" });

Cập nhật các trường thông báo và trường con của các trường đó

Các trường MESSAGE có thể có trường con (chẳng hạn như MaximizeConversions có 3 trường con: target_cpa_micros, cpc_bid_ceiling_microscpc_bid_floor_micros) hoặc không có trường con nào (chẳng hạn như ManualCpm).

Các trường thông báo không có trường con được xác định

Khi cập nhật trường MESSAGE không được xác định bằng bất kỳ trường con nào, hãy sử dụng FieldMasks để tạo mặt nạ trường, như mô tả ở trên.

Trường thông báo có các trường con được xác định

Khi cập nhật trường MESSAGE được xác định bằng các trường con mà không đặt rõ ràng bất kỳ trường con nào trên thông báo đó, bạn phải thêm từng trường con MESSAGE có thể thay đổi vào FieldMask theo cách thủ công, tương tự như ví dụ trên tạo mặt nạ trường từ đầu.

Một ví dụ phổ biến là cập nhật chiến lược đặt giá thầu của chiến dịch mà không đặt bất kỳ trường nào trên chiến lược đặt giá thầu mới. Ví dụ bên dưới minh hoạ cách cập nhật chiến dịch để sử dụng chiến lược giá thầu MaximizeConversions mà không cần đặt bất kỳ trường phụ nào trên chiến lược giá thầu.

Trong trường hợp này, việc sử dụng các phương thức AllSetFieldsOf()FromChanges() của FieldMasks sẽ không đạt được mục tiêu dự kiến.

Ví dụ sau đây tạo một mặt nạ trường bao gồm maximize_conversions. Tuy nhiên, API Google Ads không cho phép hành vi này để tránh vô tình xoá các trường và tạo lỗi 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 });

Ví dụ sau đây minh hoạ cách cập nhật đúng cách một chiến dịch để sử dụng chiến lược đặt giá thầu MaximizeConversions mà không cần đặt bất kỳ trường phụ nào.

// 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
};

Xoá trường

Bạn có thể xoá một số trường một cách rõ ràng. Tương tự như ví dụ trên, bạn phải thêm các trường này vào mặt nạ trường một cách rõ ràng. Ví dụ: giả sử bạn có một chiến dịch sử dụng chiến lược đặt giá thầu MaximizeConversions và trường target_cpa_micros được đặt giá trị lớn hơn 0.

Mã sau đây sẽ chạy; tuy nhiên, maximize_conversions.target_cpa_micros sẽ không được thêm vào mặt nạ trường, do đó, không có thay đổi nào được thực hiện đối với trường 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 });

Ví dụ tiếp theo minh hoạ cách xoá đúng cách trường target_cpa_micros trên chiến lược đặt giá thầu 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
};

Xin lưu ý rằng ví dụ "không chính xác" ở trên hoạt động như dự kiến đối với các trường được xác định là optional trong API Google Ads protocol buffers. Tuy nhiên, vì target_cpa_micros không phải là trường optional, nên ví dụ "không chính xác" không cập nhật chiến lược đặt giá thầu để xoá trường target_cpa.