Adwords Label Problems

532 views
Skip to first unread message

Arun Jha

unread,
Aug 22, 2016, 2:07:53 AM8/22/16
to AdWords Scripts Forum
Hi Guys,

I want to remove label which is applied to ads across all the accounts linked with MCC. My script is below. I am not able to do so. Kindly review and suggest me.


var LABEL = "LinkChecker_Done";

function main() {
var accountIterator = MccApp.accounts()
.get();
while (accountIterator.hasNext()) {
var account = accountIterator.next();
MccApp.select(account);
Logger.log("Processing account "+ account.getCustomerId());
var labelIterator = AdWordsApp.labels()
.withCondition("Name CONTAINS '" + LABEL +"'")
.get();
      
      while (labelIterator.hasNext()) {
        var myLabel = labelIterator.next();
        
      }
var adsIterator = AdWordsApp.ads()
.withCondition('Status = ENABLED')
.get();
while (adsIterator.hasNext()) {
var ad = adsIterator.next();
ad.removeLabel(LABEL);
}
}
}

Andy Parkerson

unread,
Aug 22, 2016, 10:11:25 AM8/22/16
to AdWords Scripts Forum
Arun,

You want to look at the labels on each ad, and then remove only the appropriate label.

Furthermore, you never need to create a label object specific to this label, as the .removeLabel() function uses a string to reference the label.

So you can get rid of this:
var labelIterator = AdWordsApp.labels()
.withCondition("Name CONTAINS '" + LABEL +"'")
.get();
      
      while (labelIterator.hasNext()) {
        var myLabel = labelIterator.next();
        
      }

You will want to read the labels of each individual ad. So after

var adsIterator = AdWordsApp.ads()
.withCondition('Status = ENABLED')
.get();

while (adsIterator.hasNext()) {
var ad = adsIterator.next();

add this:

var labelIterator = ad.labels();
var labelSelector = labelIterator.get();
while (labelSelector.hasNext()) {
 var label = labelSelector.next();
 if (label.getName() == LABEL) {
ad.removeLabel(LABEL);
}

This should take care of it. You can't remove a label that isn't there, or AdWordsScripts will throw an error.

Hope this helps.

Andy Parkerson 

Tyler Sidell (AdWords Scripts Team)

unread,
Aug 22, 2016, 10:28:15 AM8/22/16
to AdWords Scripts Forum
Thanks for providing that solution Andy.

Arun, please let us know if you have any further questions.

Thanks,
Tyler Sidell
AdWords Scripts Team

Arun Jha

unread,
Aug 23, 2016, 2:25:58 AM8/23/16
to AdWords Scripts Forum
Hi Andy,

Thanks for your reply. I have done the changes you suggest but getting time out error.

Tyler Sidell (AdWords Scripts Team)

unread,
Aug 23, 2016, 9:26:13 AM8/23/16
to AdWords Scripts Forum
Hi Arun,

Would you be able to supply us your CID (reply privately to the author) along with the name of your script so that we can take a look at these errors?

Thanks,
Tyler Sidell
AdWords Scripts Team

Andy Parkerson

unread,
Aug 23, 2016, 10:00:43 AM8/23/16
to AdWords Scripts Forum
Arun,

The script looks at each individual ad, and each individual label on the ad, and then checks to see if it is the correct label. If so, it removes it.

If you have a lot of ads with a lot of labels, it is going to be slow and very well could take more than 30 minutes to run.

It seems like the label "LinkChecker_Done" is coming from the Link Checker script. That script has a method for removing the labels when necessary.
/**
 * Removes the tracking in each account that was previously analyzed, thereby
 * clearing that account for a new analysis.
 */

function removeLabelsInAccounts() {
 
var managerAccount = AdWordsApp.currentAccount();
 
var accounts = getAccounts(true).get();

 
while (accounts.hasNext()) {
   
MccApp.select(accounts.next());
    removeLabels
([CONFIG.LABEL]);
 
}

 
MccApp.select(managerAccount);
}

/**
 * Removes all provided labels from the account. Since labels cannot be removed
 * in preview mode, throws an exception in preview mode.
 *
 * @param {Array.<string>} labelNames An array of label names.
 */

function removeLabels(labelNames) {
 
if (AdWordsApp.getExecutionInfo().isPreview()) {
   
throw 'Cannot remove labels in preview mode. Please run the script or ' +
       
'remove the labels manually.';
 
}

 
for (var i = 0; i < labelNames.length; i++) {
   
var label = getLabel(labelNames[i]);

   
if (label) {
      label
.remove();
   
}
 
}
}

What it is doing is removing the label from existence. In essence, it is saying that that label no longer is a label, and any ad with the label now has a random number where a label would go, which the AdWords ignores.

This is a MUCH faster way of doing things, as it doesn't require you to walk through the entire account structure looking at every label on every ad. However, if you want this label to be attached to something else (keywords, campaigns, etc.) this won't work, as the label doesn't exist any longer.

So I guess the question to ask is why do you want to remove this label yourself instead of letting the script remove it when applicable?

Thanks,
Andy

Arun Jha

unread,
Aug 24, 2016, 12:46:45 AM8/24/16
to AdWords Scripts Forum
Hi Andy & Tyler,

Thanks for your help. I got it. It's working fine now.


On Monday, August 22, 2016 at 11:37:53 AM UTC+5:30, Arun Jha wrote:

Tyler Sidell (AdWords Scripts Team)

unread,
Aug 24, 2016, 9:24:56 AM8/24/16
to AdWords Scripts Forum
Hi Arun,

Glad to hear it's working.  Feel free to reach out with any questions.

Thanks,
Tyler Sidell
AdWords Scripts Team

Joey Peters

unread,
Aug 24, 2016, 2:35:11 PM8/24/16
to AdWords Scripts Forum
hi there, 

I am using a script that automatically increases bids for keywords based on the labels.
Since today it's not working anymore, apparently something changed in how Google's working 
with Labels. 

Any thoughts?

This is the script:

/**
*
* Average Position Bidding Tool
*
* This script changes keyword bids so that they target specified positions,
* based on recent performance.
*
* Version: 1.2
* Updated 2015-09-28 to correct for report column name changes
* Updated 2016-02-05 to correct label reading, add extra checks and
* be able to adjust maximum bid increases and decreases separately
* Google AdWords Script maintained on brainlabsdigital.com
*
**/
 
// Options
 
var maxBid = 6.00;
// Bids will not be increased past this maximum.
 
var minBid = 0.05;
// Bids will not be decreased below this minimum.
 
var firstPageMaxBid = 0.10;
// The script avoids reducing a keyword's bid below its first page bid estimate. If you think
// Google's first page bid estimates are too high then use this to overrule them.
 
var dataFile = "AveragePositionData2.txt";
// This name is used to create a file in your Google Drive to store today's performance so far,
// for reference the next time the script is run.
 
var useFirstPageBidsOnKeywordsWithNoImpressions = false;
// If this is true, then if a keyword has had no impressions since the last time the script was run
// its bid will be increased to the first page bid estimate (or the firsPageMaxBid if that is smaller).
// If this is false, keywords with no recent impressions will be left alone.
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
 
// Advanced Options
  var bidIncreaseProportion = 0.05;
  var bidDecreaseProportion = 0.05;
  var targetPositionTolerance = 0.3;
   
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
    
function main() {
 
  var fieldJoin = ",";
  var lineJoin = "$";
  var idJoin = "#";
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var files = DriveApp.getFilesByName(dataFile);
  if (!files.hasNext()) {
    var file = DriveApp.createFile(dataFile,"");
    Logger.log("File '" + dataFile + "' has been created.");
  } else {
    var file = files.next();
    if (files.hasNext()) {
      Logger.log("Error - more than one file named '" + dataFile + "'");
      return;
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var labelIds = [];
   
  var labelIterator = AdWordsApp.labels()
  .withCondition("KeywordsCount > 0")
  .withCondition("LabelName CONTAINS_IGNORE_CASE 'Position '")
  .get();
   
  while (labelIterator.hasNext()) {
    var label = labelIterator.next();
    if (label.getName().substr(0,"position ".length).toLowerCase() == "position ") {
      labelIds.push(label.getId());
    }
  }
   
  if (labelIds.length == 0) {
    Logger.log("No position labels found.");
    return;
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var keywordData = {
    //UniqueId1: {LastHour: {Impressions: , AveragePosition: }, ThisHour: {Impressions: , AveragePosition: },
    //CpcBid: , FirstPageCpc: , MaxBid, MinBid, FirstPageMaxBid, PositionTarget: , CurrentAveragePosition:,
    //Criteria: }
  }
   
  var ids = [];
  var uniqueIds = [];
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var report = AdWordsApp.report(
    'SELECT Id, Criteria, AdGroupId, AdGroupName, CampaignName, Impressions, AveragePosition, CpcBid, FirstPageCpc, Labels, BiddingStrategyType ' +
    'FROM KEYWORDS_PERFORMANCE_REPORT ' +
    'WHERE Status = ENABLED AND AdGroupStatus = ENABLED AND CampaignStatus = ENABLED ' +
    'AND LabelIds CONTAINS_ANY [' + labelIds.join(",") + '] ' +
    'AND AdNetworkType2 = SEARCH ' +
      'AND Device NOT_IN ["HIGH_END_MOBILE"] ' +
        'DURING TODAY'
      );
   
  var rows = report.rows();
   
  while(rows.hasNext()){
    var row = rows.next();
     
    if (row["BiddingStrategyType"] != "cpc") {
      if (row["BiddingStrategyType"] == "Enhanced CPC"
      || row["BiddingStrategyType"] == "Target search page location"
      || row["BiddingStrategyType"] == "Target Outranking Share"
      || row["BiddingStrategyType"] == "None"
      || row["BiddingStrategyType"] == "unknown") {
        Logger.log("Warning: keyword " + row["Criteria"] + "' in campaign '" + row["CampaignName"] +
                   "' uses '" + row["BiddingStrategyType"] + "' rather than manual CPC. This may overrule keyword bids and interfere with the script working.");
      } else {
        Logger.log("Warning: keyword " + row["Criteria"] + "' in campaign '" + row["CampaignName"] +
                   "' uses the bidding strategy '" + row["BiddingStrategyType"] + "' rather than manual CPC. This keyword will be skipped.");
        continue;
      }
    }
     
    var positionTarget = "";
     
    var labels = row["Labels"].toLowerCase().split("; ")
    for (var i=0; i<labels.length; i++) {
      if (labels[i].substr(0,"position ".length) == "position ") {
        var positionTarget = parseFloat(labels[i].substr("position ".length-1).replace(/,/g,"."),10);
        break;
      }
    }
    if (positionTarget == "") {
      continue;
    }
    if (integrityCheck(positionTarget) == -1) {
      Logger.log("Invalid position target '" + positionTarget +  "' for keyword '" + row["Criteria"] + "' in campaign '" + row["CampaignName"] + "'");
      continue;
    }
     
    ids.push(parseFloat(row['Id'],10));
    var uniqueId = row['AdGroupId'] + idJoin + row['Id'];
    uniqueIds.push(uniqueId);
     
    keywordData[uniqueId] = {};
    keywordData[uniqueId]['Criteria'] = row['Criteria'];
    keywordData[uniqueId]['ThisHour'] = {};
     
    keywordData[uniqueId]['ThisHour']['Impressions'] = parseFloat(row['Impressions'].replace(/,/g,""),10);
    keywordData[uniqueId]['ThisHour']['AveragePosition'] = parseFloat(row['AveragePosition'].replace(/,/g,""),10);
     
    keywordData[uniqueId]['CpcBid'] = parseFloat(row['CpcBid'].replace(/,/g,""),10);
    keywordData[uniqueId]['FirstPageCpc'] = parseFloat(row['FirstPageCpc'].replace(/,/g,""),10);
        
    setPositionTargets(uniqueId, positionTarget);
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  setBidChange();
  setMinMaxBids();
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var currentHour = parseInt(Utilities.formatDate(new Date(), AdWordsApp.currentAccount().getTimeZone(), "HH"), 10);
   
  if (currentHour != 0) {
    var data = file.getBlob().getDataAsString();
    var data = data.split(lineJoin);
    for(var i = 0; i < data.length; i++){
      data[i] = data[i].split(fieldJoin);
      var uniqueId = data[i][0];
      if(keywordData.hasOwnProperty(uniqueId)){
        keywordData[uniqueId]['LastHour'] = {};
        keywordData[uniqueId]['LastHour']['Impressions'] = parseFloat(data[i][1],10);
        keywordData[uniqueId]['LastHour']['AveragePosition'] = parseFloat(data[i][2],10);
      }
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  findCurrentAveragePosition();
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  try {
    updateKeywords();
  } catch (e) {
    Logger.log("Error updating keywords: " + e);
    Logger.log("Retrying after one minute.");
    Utilities.sleep(60000);
    updateKeywords();
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  var content = resultsString();
   
  file.setContent(content);
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  // Functions
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function integrityCheck(target){
    var n = parseFloat(target, 10);
    if(!isNaN(n) && n >= 1){
      return n;
    }
    else{
      return -1;
    }
     
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function setPositionTargets(uniqueId, target){
    if(target !== -1){
      keywordData[uniqueId]['HigherPositionTarget'] = Math.max(target-targetPositionTolerance, 1);
      keywordData[uniqueId]['LowerPositionTarget'] = target+targetPositionTolerance;
    }
    else{
      keywordData[uniqueId]['HigherPositionTarget'] = -1;
      keywordData[uniqueId]['LowerPositionTarget'] = -1;
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function bidChange(uniqueId){
     
    var newBid = -1;
    if(keywordData[uniqueId]['HigherPositionTarget'] === -1){
      return newBid;
    }
     
    var cpcBid = keywordData[uniqueId]['CpcBid'];
    var minBid = keywordData[uniqueId]['MinBid'];
    var maxBid = keywordData[uniqueId]['MaxBid'];
     
    if (isNaN(keywordData[uniqueId]['FirstPageCpc'])) {
      Logger.log("Warning: first page CPC estimate is not a number for keyword '" + keywordData[uniqueId]['Criteria'] + "'. This keyword will be skipped");
      return -1;
    }
     
    var firstPageBid = Math.min(keywordData[uniqueId]['FirstPageCpc'], keywordData[uniqueId]['FirstPageMaxBid'], maxBid);
     
    var currentPosition = keywordData[uniqueId]['CurrentAveragePosition'];
    var higherPositionTarget = keywordData[uniqueId]['HigherPositionTarget'];
    var lowerPositionTarget = keywordData[uniqueId]['LowerPositionTarget'];
     
    var bidIncrease = keywordData[uniqueId]['BidIncrease'];
    var bidDecrease = keywordData[uniqueId]['BidDecrease'];
     
    if((currentPosition > lowerPositionTarget) && (currentPosition !== 0)){
      var linearBidModel = Math.min(2*bidIncrease,(2*bidIncrease/lowerPositionTarget)*(currentPosition-lowerPositionTarget));
      var newBid = Math.min((cpcBid + linearBidModel), maxBid);
    }
    if((currentPosition < higherPositionTarget) && (currentPosition !== 0)) {
      var linearBidModel = Math.min(2*bidDecrease,((-4)*bidDecrease/higherPositionTarget)*(currentPosition-higherPositionTarget));
      var newBid = Math.max((cpcBid-linearBidModel),minBid);
      if (cpcBid > firstPageBid) {
        var newBid = Math.max(firstPageBid,newBid);
      }
    }
    if((currentPosition === 0) && useFirstPageBidsOnKeywordsWithNoImpressions && (cpcBid < firstPageBid)){
      var newBid = firstPageBid;
    }
     
    if (isNaN(newBid)) {
      Logger.log("Warning: new bid is not a number for keyword '" + keywordData[uniqueId]['Criteria'] + "'. This keyword will be skipped");
      return -1;
    }
     
    return newBid;
     
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function findCurrentAveragePosition(){
    for(var x in keywordData){
      if(keywordData[x].hasOwnProperty('LastHour')){
        keywordData[x]['CurrentAveragePosition'] = calculateAveragePosition(keywordData[x]);
      } else {
        keywordData[x]['CurrentAveragePosition'] = keywordData[x]['ThisHour']['AveragePosition'];
      }
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function calculateAveragePosition(keywordDataElement){
    var lastHourImpressions = keywordDataElement['LastHour']['Impressions'];
    var lastHourAveragePosition = keywordDataElement['LastHour']['AveragePosition'];
     
    var thisHourImpressions = keywordDataElement['ThisHour']['Impressions'];
    var thisHourAveragePosition = keywordDataElement['ThisHour']['AveragePosition'];
     
    if(thisHourImpressions == lastHourImpressions){
      return 0;
    }
    else{
      var currentPosition = (thisHourImpressions*thisHourAveragePosition-lastHourImpressions*lastHourAveragePosition)/(thisHourImpressions-lastHourImpressions);
      if (currentPosition < 1) {
        return 0;
      } else {
        return currentPosition;
      }
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function keywordUniqueId(keyword){
    var id = keyword.getId();
    var idsIndex = ids.indexOf(id);
    if(idsIndex === ids.lastIndexOf(id)){
      return uniqueIds[idsIndex];
    }
    else{
      var adGroupId = keyword.getAdGroup().getId();
      return adGroupId + idJoin + id;
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function setMinMaxBids(){
    for(var x in keywordData){
      keywordData[x]['MinBid'] = minBid;
      keywordData[x]['MaxBid'] = maxBid;
      keywordData[x]['FirstPageMaxBid'] = firstPageMaxBid;
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function setBidChange(){
    for(var x in keywordData){
      keywordData[x]['BidIncrease'] = keywordData[x]['CpcBid'] * bidIncreaseProportion/2;
      keywordData[x]['BidDecrease'] = keywordData[x]['CpcBid'] * bidDecreaseProportion/2;
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function updateKeywords() {
    var keywordIterator = AdWordsApp.keywords()
    .withIds(uniqueIds.map(function(str){return str.split(idJoin);}))
    .get();
    while(keywordIterator.hasNext()){
      var keyword = keywordIterator.next();
       
      var uniqueId = keywordUniqueId(keyword);
       
      var newBid = bidChange(uniqueId);
       
      if(newBid !== -1){
        keyword.setMaxCpc(newBid);
      }
       
    }
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
  function resultsString(){
     
    var results = [];
    for(var uniqueId in keywordData){
      var resultsRow = [uniqueId, keywordData[uniqueId]['ThisHour']['Impressions'], keywordData[uniqueId]['ThisHour']['AveragePosition']];
      results.push(resultsRow.join(fieldJoin));
    }
     
    return results.join(lineJoin);
  }
   
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
   
}

Tyler Sidell (AdWords Scripts Team)

unread,
Aug 24, 2016, 4:24:57 PM8/24/16
to AdWords Scripts Forum
Hi Joey,

There we no issues on our end but I'd suggest upgrading your script to the most recent version of our Bid by Position script here.  Since your script is maintained by a third-party, brainlabsdigital, I'd suggest reaching out to them as well.  Since this is maintained by a third-party, we are limited in the bugs that might exist in their script.

Let us know if that resolves your issue.

Thanks,
Tyler Sidell
AdWords Scripts Team

Reply all
Reply to author
Forward
0 new messages