至此我们已经了解了如何为单个实体创建 Mutate 操作。 制作新的智能广告系列时,我们可以将它们合并为一个 用于一次创建所有对象的请求。
使用单个 mutate 请求的优势如下:
- 降低复杂性,因为这些实体不共享且高度依赖 相互依赖。
- 如果某项操作失败,则阻止孤立实体存在 任何原因。
请注意,使用临时资源名称在单个列表中创建实体时, 因此,务必要对操作进行排序,以便实体 具有依赖项的必须先创建
/**
* Sends a mutate request with a group of mutate operations.
*
* <p>The {@link GoogleAdsServiceClient} allows batching together a list of operations. These are
* executed sequentially, and later operations my refer to previous operations via temporary IDs.
* For more detail on this, please refer to
* https://developers.google.com/google-ads/api/docs/batch-processing/temporary-ids.
*/
private void sendMutateRequest(
GoogleAdsClient googleAdsClient, long customerId, List<MutateOperation> operations) {
try (GoogleAdsServiceClient client =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
MutateGoogleAdsResponse outerResponse = client.mutate(String.valueOf(customerId), operations);
for (MutateOperationResponse innerResponse :
outerResponse.getMutateOperationResponsesList()) {
OneofDescriptor oneofDescriptor =
innerResponse.getDescriptorForType().getOneofs().stream()
.filter(o -> o.getName().equals("response"))
.findFirst()
.get();
Message createdEntity =
(Message)
innerResponse.getField(innerResponse.getOneofFieldDescriptor(oneofDescriptor));
String resourceName =
(String)
createdEntity.getField(
createdEntity.getDescriptorForType().findFieldByName("resource_name"));
System.out.printf(
"Created a(n) %s with resource name: '%s'.%n",
createdEntity.getClass().getSimpleName(), resourceName);
}
}
}
// The below methods create and return MutateOperations that we later provide to
// the GoogleAdsService.Mutate method in order to create the entities in a single
// request. Since the entities for a Smart campaign are closely tied to one-another
// it's considered a best practice to create them in a single Mutate request; the
// entities will either all complete successfully or fail entirely, leaving no
// orphaned entities. See:
// https://developers.google.com/google-ads/api/docs/mutating/overview
MutateOperation campaignBudgetOperation =
CreateCampaignBudgetOperation(customerId, suggestedBudgetAmount);
MutateOperation smartCampaignOperation =
CreateSmartCampaignOperation(customerId);
MutateOperation smartCampaignSettingOperation =
CreateSmartCampaignSettingOperation(customerId, businessProfileLocation,
businessName);
IEnumerable<MutateOperation> campaignCriterionOperations =
CreateCampaignCriterionOperations(customerId, keywordThemeInfos,
suggestionInfo);
MutateOperation adGroupOperation = CreateAdGroupOperation(customerId);
MutateOperation adGroupAdOperation = CreateAdGroupAdOperation(customerId,
adSuggestions);
// Send the operations in a single mutate request.
MutateGoogleAdsRequest mutateGoogleAdsRequest = new MutateGoogleAdsRequest
{
CustomerId = customerId.ToString()
};
// It's important to create these entities in this order because they depend on
// each other, for example the SmartCampaignSetting and ad group depend on the
// campaign, and the ad group ad depends on the ad group.
mutateGoogleAdsRequest.MutateOperations.Add(campaignBudgetOperation);
mutateGoogleAdsRequest.MutateOperations.Add(smartCampaignOperation);
mutateGoogleAdsRequest.MutateOperations.Add(smartCampaignSettingOperation);
mutateGoogleAdsRequest.MutateOperations.Add(campaignCriterionOperations);
mutateGoogleAdsRequest.MutateOperations.Add(adGroupOperation);
mutateGoogleAdsRequest.MutateOperations.Add(adGroupAdOperation);
MutateGoogleAdsResponse response =
googleAdsServiceClient.Mutate(mutateGoogleAdsRequest);
PrintResponseDetails(response);
// The below methods create and return MutateOperations that we later provide to the
// GoogleAdsService.Mutate method in order to create the entities in a single request.
// Since the entities for a Smart campaign are closely tied to one-another it's considered
// a best practice to create them in a single Mutate request so they all complete
// successfully or fail entirely, leaving no orphaned entities.
// See: https://developers.google.com/google-ads/api/docs/mutating/overview.
$campaignBudgetOperation = self::createCampaignBudgetOperation(
$customerId,
$suggestedBudgetAmount
);
$smartCampaignOperation = self::createSmartCampaignOperation($customerId);
$smartCampaignSettingOperation = self::createSmartCampaignSettingOperation(
$customerId,
$businessProfileLocationResourceName,
$businessName
);
$campaignCriterionOperations = self::createCampaignCriterionOperations(
$customerId,
$keywordThemeInfos,
$suggestionInfo
);
$adGroupOperation = self::createAdGroupOperation($customerId);
$adGroupAdOperation = self::createAdGroupAdOperation($customerId, $adSuggestions);
// Issues a single mutate request to add the entities.
$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
$response = $googleAdsServiceClient->mutate(MutateGoogleAdsRequest::build(
$customerId,
// It's important to create these entities in this order because they depend on
// each other, for example the SmartCampaignSetting and ad group depend on the
// campaign, and the ad group ad depends on the ad group.
array_merge(
[
$campaignBudgetOperation,
$smartCampaignOperation,
$smartCampaignSettingOperation,
],
$campaignCriterionOperations,
[
$adGroupOperation,
$adGroupAdOperation
]
)
));
self::printResponseDetails($response);
}
# The below methods create and return MutateOperations that we later
# provide to the GoogleAdsService.Mutate method in order to create the
# entities in a single request. Since the entities for a Smart campaign
# are closely tied to one-another it's considered a best practice to
# create them in a single Mutate request so they all complete successfully
# or fail entirely, leaving no orphaned entities. See:
# https://developers.google.com/google-ads/api/docs/mutating/overview
campaign_budget_operation = create_campaign_budget_operation(
client, customer_id, suggested_budget_amount
)
smart_campaign_operation = create_smart_campaign_operation(
client, customer_id
)
smart_campaign_setting_operation = create_smart_campaign_setting_operation(
client, customer_id, business_profile_location, business_name
)
campaign_criterion_operations = create_campaign_criterion_operations(
client, customer_id, keyword_theme_infos, suggestion_info
)
ad_group_operation = create_ad_group_operation(client, customer_id)
ad_group_ad_operation = create_ad_group_ad_operation(
client, customer_id, ad_suggestions
)
googleads_service = client.get_service("GoogleAdsService")
# Send the operations into a single Mutate request.
response = googleads_service.mutate(
customer_id=customer_id,
mutate_operations=[
# It's important to create these entities in this order because
# they depend on each other, for example the SmartCampaignSetting
# and ad group depend on the campaign, and the ad group ad depends
# on the ad group.
campaign_budget_operation,
smart_campaign_operation,
smart_campaign_setting_operation,
# Expand the list of campaign criterion operations into the list of
# other mutate operations
*campaign_criterion_operations,
ad_group_operation,
ad_group_ad_operation,
],
)
print_response_details(response)
# The below methods create and return MutateOperations that we later
# provide to the GoogleAdsService.Mutate method in order to create the
# entities in a single request. Since the entities for a Smart campaign
# are closely tied to one-another it's considered a best practice to
# create them in a single Mutate request so they all complete successfully
# or fail entirely, leaving no orphaned entities. See:
# https://developers.google.com/google-ads/api/docs/mutating/overview
mutate_operations = []
# It's important to create these operations in this order because
# they depend on each other, for example the SmartCampaignSetting
# and ad group depend on the campaign, and the ad group ad depends
# on the ad group.
mutate_operations << create_campaign_budget_operation(
client,
customer_id,
suggested_budget_amount,
)
mutate_operations << create_smart_campaign_operation(
client,
customer_id,
)
mutate_operations << create_smart_campaign_setting_operation(
client,
customer_id,
business_profile_location,
business_name,
)
mutate_operations += create_campaign_criterion_operations(
client,
customer_id,
keyword_theme_infos,
suggestion_info,
)
mutate_operations << create_ad_group_operation(client, customer_id)
mutate_operations << create_ad_group_ad_operation(
client,
customer_id,
ad_suggestions
)
# Sends the operations into a single Mutate request.
response = client.service.google_ads.mutate(
customer_id: customer_id,
mutate_operations: mutate_operations,
)
print_response_details(response)
# The below methods create and return MutateOperations that we later provide to the
# GoogleAdsService.Mutate method in order to create the entities in a single
# request. Since the entities for a Smart campaign are closely tied to one-another
# it's considered a best practice to create them in a single Mutate request; the
# entities will either all complete successfully or fail entirely, leaving no
# orphaned entities. See:
# https://developers.google.com/google-ads/api/docs/mutating/overview
my $campaign_budget_operation =
_create_campaign_budget_operation($customer_id, $suggested_budget_amount);
my $smart_campaign_operation = _create_smart_campaign_operation($customer_id);
my $smart_campaign_setting_operation =
_create_smart_campaign_setting_operation($customer_id,
$business_profile_location, $business_name);
my $campaign_criterion_operations =
_create_campaign_criterion_operations($customer_id, $keyword_theme_infos,
$suggestion_info);
my $ad_group_operation = _create_ad_group_operation($customer_id);
my $ad_group_ad_operation =
_create_ad_group_ad_operation($customer_id, $ad_suggestions);
# It's important to create these entities in this order because they depend on
# each other. For example, the SmartCampaignSetting and ad group depend on the
# campaign and the ad group ad depends on the ad group.
my $mutate_operations = [
$campaign_budget_operation, $smart_campaign_operation,
$smart_campaign_setting_operation,
# Expand the list of campaign criterion operations into the list of
# other mutate operations.
@$campaign_criterion_operations,
$ad_group_operation, $ad_group_ad_operation
];
# Send the operations in a single mutate request.
my $mutate_google_ads_response = $api_client->GoogleAdsService()->mutate({
customerId => $customer_id,
mutateOperations => $mutate_operations
});
_print_response_details($mutate_google_ads_response);