临时资源名称
BatchJobService 支持临时资源名称,这些名称可在同一批量作业的后续操作中引用,包括使用 sequence_token 上传的多个连续 AddBatchJobOperations 请求。这样,您就可以在分配服务器端 ID 之前,通过单个批量作业创建广告系列及其依赖的广告组、广告和条件。在以下一般规则和示例中,单个请求是指一个完整的 BatchJob 及其所有 AddBatchJobOperations 上传。
如需在同一 mutate 请求或批量作业中引用新创建的资源,请在新资源的 resource_name 字段中指定一个负整数 ID(例如 -1 或 -2,不包括 0)。例如,在批量请求中创建广告系列时,请将其资源名称设置为 customers/CUSTOMER_ID/campaigns/-1。在同一请求的后续操作中创建广告组时,请将 customers/CUSTOMER_ID/campaigns/-1 引用为父级广告系列。API 会自动将 -1 替换为创建时生成的实际广告系列 ID。
使用限制
使用临时资源名称时,请注意以下规则:
- 顺序很重要:您只能在定义临时资源名称后引用它。在操作列表中,依赖操作(例如创建广告组)必须出现在创建其父资源的操作(例如创建广告系列)之后。
- 单请求或批量作业范围:临时资源名称不会在不同的作业或 mutate 请求之间保留。如需引用在之前的作业或 mutate 请求中创建的资源,请使用系统生成的实际资源名称。
- 全局唯一性:在单个作业或 mutate 请求中,每个临时资源名称在所有资源类型中都必须使用唯一的负整数。例如,您不能在同一请求中将
-1同时分配给广告系列和广告组。在同一请求或批量作业中重复使用临时 ID 会返回NewResourceCreationError.DUPLICATE_TEMP_IDS错误。
示例载荷
假设您想在单个 API 请求或批量作业中添加广告系列、广告组和广告。您可以在 GoogleAdsService.Mutate 或 BatchJobService.AddBatchJobOperations 请求载荷中构建 mutateOperations 数组,如以下 REST JSON 示例所示(为简洁起见,省略了其他必需的资源字段):
{
"mutateOperations": [
{
"campaignOperation": {
"create": {
"resourceName": "customers/CUSTOMER_ID/campaigns/-1"
}
}
},
{
"adGroupOperation": {
"create": {
"resourceName": "customers/CUSTOMER_ID/adGroups/-2",
"campaign": "customers/CUSTOMER_ID/campaigns/-1"
}
}
},
{
"adGroupAdOperation": {
"create": {
"adGroup": "customers/CUSTOMER_ID/adGroups/-2"
}
}
}
]
}
此示例演示了以下关键细节:
- 该广告组使用新的临时 ID (
-2),因为-1已分配给广告系列。 - 广告组引用
customers/CUSTOMER_ID/campaigns/-1,以将自身与在前面的操作中创建的广告系列相关联。 adGroupAdOperation引用了customers/CUSTOMER_ID/adGroups/-2,并省略了resourceName,因为请求中的后续操作均未引用新广告。
批量作业中的错误处理
由于批量作业中的标准操作在执行时会启用部分失败(原子子批次除外),因此,如果具有临时 ID 的父级资源未通过验证,则引用该临时 ID 的任何依赖子级操作都会失败,并显示 NewResourceCreationError.TEMP_ID_RESOURCE_HAD_ERRORS。
在同一批量作业中的多个 create 操作中重复使用相同的负 ID 会返回 NewResourceCreationError.DUPLICATE_TEMP_IDS。临时 ID 仅在创建资源 (create) 或引用新创建的父级资源时有效;例如,在调用 AddBatchJobOperations 时,在 AdGroupCriterionOperation.remove 中传递负临时 ID 会返回 RequestError.RESOURCE_NAME_MALFORMED。