Viewing previous posts on this topic, I've decided it would be easier just to delete my partition tree and create a new one. However, I get an error when I try. I've created operations of type REMOVE in the ProductPartitionHelper.cs class like so (very similar to the ...
public void CreateRemoveOperation(AdGroupCriterion criterion)
{
criterion.adGroupId = this.adGroupId;
AdGroupCriterionOperation operation = new AdGroupCriterionOperation();
operation.operand = criterion;
operation.@operator = Operator.REMOVE;
this.operations.Add(operation);
}
Then I get all the Partitions in the adGroup. There are 3 of them in my case: the default partition (type SUBDIVISION), the partition I want to bid on (type UNIT), and the "everything else" partition (also type UNIT). Then I loop through them to create delete operations using the ProductPartitionHelper, followed by the mutate operation, like so...
List<AdGroupCriterion> list = GetCriteriaForShoppingAdGroup(adGroupID);
Debug.WriteLine(list.Count);
ProductPartitionHelper helper = new ProductPartitionHelper(adGroupID);
foreach (AdGroupCriterion cri in list)
{
helper.CreateRemoveOperation(cri);
}
AdGroupCriterionService adGroupCriterionService =
(AdGroupCriterionService)user.GetService(
AdWordsService.v201406.AdGroupCriterionService);
try
{
adGroupCriterionService.mutate(helper.Operations);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
if (ex.InnerException != null)
{
Debug.WriteLine("Inner Exception:" + ex.InnerException.Message);
}
}
...it chokes on the mutate method with this: Inner Exception:[AdGroupCriterionError.PRODUCT_PARTITION_DOES_NOT_EXIST @ operations[1].
operand.criterion.id, AdGroupCriterionError.PRODUCT_PARTITION_DOES_NOT_EXIST @ operations[2].
operand.criterion.id]
the third partition in this tree, the "everything else" partition, (the one represented by operations[2]) is excluded, hence the Google API gave it a type of NegativeAdGroupCriterion (criterionUse = "NEGATIVE").
So, since it thinks this partition doesn't exist, I tried passing only the first two, omitting the 3rd. When I do that, I get the same error:
Inner Exception:[AdGroupCriterionError.PRODUCT_PARTITION_DOES_NOT_EXIST @ operations[1].
operand.criterion.id]
...that operation is represented by the real product I'm bidding on, and it most assuredly does exist. I can verify this by downloading the report from the UI for the adGroup and comparing criterion ID's. It's definitely a product partition with a criterion type of BIDDABLE.
Finally, I tried removing just the root partition. I had seen earlier Josh indicated that removing that partition performs a cascading delete. However, when I do that, I get this exception:
Inner Exception:[OperationAccessDenied.OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE @ operations[0].operand.userStatus; trigger:'SHOPPING', OperationAccessDenied.OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE @ operations[0].operand.biddingStrategyConfiguration.biddingScheme; trigger:'SHOPPING', OperationAccessDenied.OPERATION_NOT_PERMITTED_FOR_CAMPAIGN_TYPE @ operations[0].operand.biddingStrategyConfiguration.biddingStrategyType; trigger:'SHOPPING']
So, can somebody from the adwords team set me straight? How do you delete a partition tree out of an adGroup through the API that contains an excluded partition (all of ours do)? It doesn't seem to like anything I throw at it.
Eric