Re: Better way to manage Ad Extensions?

2010-09-28 Thread DavM
Hi Anash

Is it possible to just update a sitelink url with out deleting and re-
creating?

I've tried and got a OperatorError.OPERATOR_NOT_SUPPORTED error.
Could you provide some code?

Cheers

David

On Aug 18, 12:00 pm, AdWords API Advisor
adwordsapiadvi...@google.com wrote:
 Hi Joel,

 To add (or modify)SiteLinksfor a campaign, you have to

 - Check if there is an active SiteLinkExtension. If yes, remove it.
 (Otherwise you will get
 CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN).
 - Add a new SiteLinkExtension with the desiredSiteLinks.

 The sample code in C# to check if a campaign has activesitelinksis
 given below:

 long siteLinkExtensionId = -1;

 // Get the campaign ad extension containingsitelinks.
 CampaignAdExtensionSelector selector = new
 CampaignAdExtensionSelector();
 selector.campaignIds = new long[] { campaignId };
 selector.statuses = new CampaignAdExtensionStatus[]
 { CampaignAdExtensionStatus.ACTIVE };

 CampaignAdExtensionPage page = campaignExtensionService.get(selector);
 if (page != null  page.entries != null) {
   foreach (CampaignAdExtension extension in page.entries) {
     if (extension.adExtension is SitelinksExtension) {
       siteLinkExtensionId = extension.adExtension.id;
       break;
     }
   }

 }

 If there are activesitelinks, then you can remove them as follows:

 if (siteLinkExtensionId == -1) {
   return; // No activesitelinks, so no need to remove.

 }

 CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
 campaignAdExtension.campaignId = campaignId;
 campaignAdExtension.adExtension = new AdExtension();     // no need to
 create a SiteLinksExtension here, just an AdExtension would do.
 campaignAdExtension.adExtension.id = siteLinkExtensionId;

 CampaignAdExtensionOperation operation = new
 CampaignAdExtensionOperation();
 operati...@operator = Operator.REMOVE;
 operation.operand = campaignAdExtension;

 CampaignAdExtensionReturnValue retVal =
     campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
 { operation });

 Now you can addsitelinksas follows:

 // create yoursitelinks.
 Sitelink siteLink = new Sitelink();
 siteLink.displayText = New albums;
 siteLink.destinationUrl = http://www.example.com/albums/new;;

 SitelinksExtension siteLinkExtension = new SitelinksExtension();
 siteLinkExtension.sitelinks= new Sitelink[] {siteLink};

 CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
 campaignAdExtension.adExtension = siteLinkExtension;
 campaignAdExtension.campaignId = campaignId;

 CampaignAdExtensionOperation operation = new
 CampaignAdExtensionOperation();
 operati...@operator = Operator.ADD;
 operation.operand = campaignAdExtension;

 CampaignAdExtensionReturnValue retVal =
     campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
 {operation});

 Hope this helps. Let me know if you have more questions.

 Cheers,
 Anash P. Oommen,
 AdWords API Advisor.

 On Aug 18, 1:13 am, joel joel.patt...@gmail.com wrote:



  To follow-up, I can't even seem to removeSiteLinksusing my
  methodology above. If I request theSiteLinksand then attempt a
  REMOVE operation, I get a NotEmptyError.EMPTY_LIST exception because
  my SitelinksExtension object has noSitelinksattached. If I don't
  remove and simply call another ADD while specifying the existing
  SitelinksExtension Id, I get an INVALID_ADEXTENSION_ID errors. Lastly,
  if I simply try to ADD without setting the Id or removing, then I get
  a CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN error.

  Here's a snippet of my code:

  CampaignAdExtensionServiceInterface extSvc =
  user.getService(AdWordsService.V201003.CAMPAIGN_AD_EXTENSION_SERVICE);

  try
  {
                  CampaignAdExtensionSelector selector = new
  CampaignAdExtensionSelector();
                  selector.setCampaignIds(new long[]
  { dbCampaign.getExternalIdAsLong() });

                  // Get all campaign ad extensions.
                  CampaignAdExtensionPage page = extSvc.get(selector);

                  // Display campaign ad extensions.
                  if (page.getEntries() != null 
  page.getEntries().length  0)
                  {
                      for (CampaignAdExtension campaignAdExtension :
  page.getEntries())
                      {
                          if
  (campaignAdExtension.getAdExtension().getAdExtensionType().equals(Sitelink 
  sExtension))
                          {
                              SitelinksExtension ext = new
  SitelinksExtension();

  ext.setId(campaignAdExtension.getAdExtension().getId());

                              CampaignAdExtension extension = new
  CampaignAdExtension();

  extension.setCampaignId(dbCampaign.getExternalIdAsLong());
                              extension.setAdExtension(ext);

                              CampaignAdExtensionOperation operation =
  new CampaignAdExtensionOperation();
                              operation.setOperand(extension);
                              

Re: Better way to manage Ad Extensions?

2010-08-18 Thread AdWords API Advisor
Hi Joel,

To add (or modify) SiteLinks for a campaign, you have to

- Check if there is an active SiteLinkExtension. If yes, remove it.
(Otherwise you will get
CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN).
- Add a new SiteLinkExtension with the desired SiteLinks.

The sample code in C# to check if a campaign has active sitelinks is
given below:

long siteLinkExtensionId = -1;

// Get the campaign ad extension containing sitelinks.
CampaignAdExtensionSelector selector = new
CampaignAdExtensionSelector();
selector.campaignIds = new long[] { campaignId };
selector.statuses = new CampaignAdExtensionStatus[]
{ CampaignAdExtensionStatus.ACTIVE };

CampaignAdExtensionPage page = campaignExtensionService.get(selector);
if (page != null  page.entries != null) {
  foreach (CampaignAdExtension extension in page.entries) {
if (extension.adExtension is SitelinksExtension) {
  siteLinkExtensionId = extension.adExtension.id;
  break;
}
  }
}

If there are active sitelinks, then you can remove them as follows:

if (siteLinkExtensionId == -1) {
  return; // No active sitelinks, so no need to remove.
}

CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
campaignAdExtension.campaignId = campaignId;
campaignAdExtension.adExtension = new AdExtension(); // no need to
create a SiteLinksExtension here, just an AdExtension would do.
campaignAdExtension.adExtension.id = siteLinkExtensionId;

CampaignAdExtensionOperation operation = new
CampaignAdExtensionOperation();
operati...@operator = Operator.REMOVE;
operation.operand = campaignAdExtension;

CampaignAdExtensionReturnValue retVal =
campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
{ operation });

Now you can add sitelinks as follows:

// create your sitelinks.
Sitelink siteLink = new Sitelink();
siteLink.displayText = New albums;
siteLink.destinationUrl = http://www.example.com/albums/new;;

SitelinksExtension siteLinkExtension = new SitelinksExtension();
siteLinkExtension.sitelinks = new Sitelink[] {siteLink};

CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
campaignAdExtension.adExtension = siteLinkExtension;
campaignAdExtension.campaignId = campaignId;

CampaignAdExtensionOperation operation = new
CampaignAdExtensionOperation();
operati...@operator = Operator.ADD;
operation.operand = campaignAdExtension;

CampaignAdExtensionReturnValue retVal =
campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
{operation});


Hope this helps. Let me know if you have more questions.

Cheers,
Anash P. Oommen,
AdWords API Advisor.

On Aug 18, 1:13 am, joel joel.patt...@gmail.com wrote:
 To follow-up, I can't even seem to remove SiteLinks using my
 methodology above. If I request the SiteLinks and then attempt a
 REMOVE operation, I get a NotEmptyError.EMPTY_LIST exception because
 my SitelinksExtension object has no Sitelinks attached. If I don't
 remove and simply call another ADD while specifying the existing
 SitelinksExtension Id, I get an INVALID_ADEXTENSION_ID errors. Lastly,
 if I simply try to ADD without setting the Id or removing, then I get
 a CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN error.

 Here's a snippet of my code:

 CampaignAdExtensionServiceInterface extSvc =
 user.getService(AdWordsService.V201003.CAMPAIGN_AD_EXTENSION_SERVICE);

 try
 {
                 CampaignAdExtensionSelector selector = new
 CampaignAdExtensionSelector();
                 selector.setCampaignIds(new long[]
 { dbCampaign.getExternalIdAsLong() });

                 // Get all campaign ad extensions.
                 CampaignAdExtensionPage page = extSvc.get(selector);

                 // Display campaign ad extensions.
                 if (page.getEntries() != null 
 page.getEntries().length  0)
                 {
                     for (CampaignAdExtension campaignAdExtension :
 page.getEntries())
                     {
                         if
 (campaignAdExtension.getAdExtension().getAdExtensionType().equals(Sitelink 
 sExtension))
                         {
                             SitelinksExtension ext = new
 SitelinksExtension();

 ext.setId(campaignAdExtension.getAdExtension().getId());

                             CampaignAdExtension extension = new
 CampaignAdExtension();

 extension.setCampaignId(dbCampaign.getExternalIdAsLong());
                             extension.setAdExtension(ext);

                             CampaignAdExtensionOperation operation =
 new CampaignAdExtensionOperation();
                             operation.setOperand(extension);
                             operation.setOperator(Operator.REMOVE);

                             extSvc.mutate(new
 CampaignAdExtensionOperation[] { operation });

                             break;
                         }
                     }
                 }
             }
             catch (Exception e)
             {
                 ServiceResult failure =
 

Re: Better way to manage Ad Extensions?

2010-08-18 Thread joel
Thank you, that worked. I was 99% of the way there.

The only difference is that in my REMOVE operation I was using new
SiteLinkExtension() whereas you used new AdExtension(); // no
need to create a SiteLinksExtension here, just an AdExtension would
do.

So for future reference for others: use the generic AdExtension object
in REMOVES.

Thanks,

Joel


On Aug 18, 7:00 am, AdWords API Advisor adwordsapiadvi...@google.com
wrote:
 Hi Joel,

 To add (or modify) SiteLinks for a campaign, you have to

 - Check if there is an active SiteLinkExtension. If yes, remove it.
 (Otherwise you will get
 CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN).
 - Add a new SiteLinkExtension with the desired SiteLinks.

 The sample code in C# to check if a campaign has active sitelinks is
 given below:

 long siteLinkExtensionId = -1;

 // Get the campaign ad extension containing sitelinks.
 CampaignAdExtensionSelector selector = new
 CampaignAdExtensionSelector();
 selector.campaignIds = new long[] { campaignId };
 selector.statuses = new CampaignAdExtensionStatus[]
 { CampaignAdExtensionStatus.ACTIVE };

 CampaignAdExtensionPage page = campaignExtensionService.get(selector);
 if (page != null  page.entries != null) {
   foreach (CampaignAdExtension extension in page.entries) {
     if (extension.adExtension is SitelinksExtension) {
       siteLinkExtensionId = extension.adExtension.id;
       break;
     }
   }

 }

 If there are active sitelinks, then you can remove them as follows:

 if (siteLinkExtensionId == -1) {
   return; // No active sitelinks, so no need to remove.

 }

 CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
 campaignAdExtension.campaignId = campaignId;
 campaignAdExtension.adExtension = new AdExtension();     // no need to
 create a SiteLinksExtension here, just an AdExtension would do.
 campaignAdExtension.adExtension.id = siteLinkExtensionId;

 CampaignAdExtensionOperation operation = new
 CampaignAdExtensionOperation();
 operati...@operator = Operator.REMOVE;
 operation.operand = campaignAdExtension;

 CampaignAdExtensionReturnValue retVal =
     campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
 { operation });

 Now you can add sitelinks as follows:

 // create your sitelinks.
 Sitelink siteLink = new Sitelink();
 siteLink.displayText = New albums;
 siteLink.destinationUrl = http://www.example.com/albums/new;;

 SitelinksExtension siteLinkExtension = new SitelinksExtension();
 siteLinkExtension.sitelinks = new Sitelink[] {siteLink};

 CampaignAdExtension campaignAdExtension = new CampaignAdExtension();
 campaignAdExtension.adExtension = siteLinkExtension;
 campaignAdExtension.campaignId = campaignId;

 CampaignAdExtensionOperation operation = new
 CampaignAdExtensionOperation();
 operati...@operator = Operator.ADD;
 operation.operand = campaignAdExtension;

 CampaignAdExtensionReturnValue retVal =
     campaignExtensionService.mutate(new CampaignAdExtensionOperation[]
 {operation});

 Hope this helps. Let me know if you have more questions.

 Cheers,
 Anash P. Oommen,
 AdWords API Advisor.

 On Aug 18, 1:13 am, joel joel.patt...@gmail.com wrote:

  To follow-up, I can't even seem to remove SiteLinks using my
  methodology above. If I request the SiteLinks and then attempt a
  REMOVE operation, I get a NotEmptyError.EMPTY_LIST exception because
  my SitelinksExtension object has no Sitelinks attached. If I don't
  remove and simply call another ADD while specifying the existing
  SitelinksExtension Id, I get an INVALID_ADEXTENSION_ID errors. Lastly,
  if I simply try to ADD without setting the Id or removing, then I get
  a CANNOT_HAVE_MULTIPLE_SITELINKS_EXTENSIONS_PER_CAMPAIGN error.

  Here's a snippet of my code:

  CampaignAdExtensionServiceInterface extSvc =
  user.getService(AdWordsService.V201003.CAMPAIGN_AD_EXTENSION_SERVICE);

  try
  {
                  CampaignAdExtensionSelector selector = new
  CampaignAdExtensionSelector();
                  selector.setCampaignIds(new long[]
  { dbCampaign.getExternalIdAsLong() });

                  // Get all campaign ad extensions.
                  CampaignAdExtensionPage page = extSvc.get(selector);

                  // Display campaign ad extensions.
                  if (page.getEntries() != null 
  page.getEntries().length  0)
                  {
                      for (CampaignAdExtension campaignAdExtension :
  page.getEntries())
                      {
                          if
  (campaignAdExtension.getAdExtension().getAdExtensionType().equals(Sitelink 
  sExtension))
                          {
                              SitelinksExtension ext = new
  SitelinksExtension();

  ext.setId(campaignAdExtension.getAdExtension().getId());

                              CampaignAdExtension extension = new
  CampaignAdExtension();

  extension.setCampaignId(dbCampaign.getExternalIdAsLong());
                              extension.setAdExtension(ext);