Google script to upload location bid modifiers

34 views
Skip to first unread message

Kai Yan Chan

unread,
Jun 18, 2020, 4:15:28 PM6/18/20
to Google Ads Scripts Forum
Hi,

I am writing a Google script to upload location bid modifiers for each campaign, specified in a Google sheet.

The campaign names are specified in a column in a Google sheet and I am using the following script:

  var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = spreadsheet.getActiveSheet();
  var data = sheet.getRange("A:D").getValues();
  var campaign = data[i][0] -- campaign names
    var locationId = data[i][2]; -- location IDs
    var bidModifier = data[i][3]; -- bid modifiers

    if(campaign == "") { break; }
    else {
      var campaignIterator = campaignSelector.get();
      while (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next()
        var campaignName = campaign.getName();
        var campaignId = campaign.getId();
        campaignIds.push(campaignId);
         if(locationId == "") { continue; }
         else {
           campaign.addLocation(locationId, bidModifier)
           Logger.log(campaign + ' has added' + locationId)

However, this script is unable to read the campaign names. Can someone help me with this?

Thanks!

Google Ads Scripts Forum Advisor

unread,
Jun 18, 2020, 5:02:15 PM6/18/20
to adwords-scripts+apn2wqctraqi9sfd...@googlegroups.com, adwords-scripts+apn2wqctraqi9sfd...@googlegroups.co, adwords...@googlegroups.com
Hello,

Though there may be other issues in the code, the bold portion of the lines:

 
 var campaign = data[i][0] -- campaign names
    var locationId = data[i][2]; -- location IDs
    var bidModifier = data[i][3]; -- bid modifiers

Will throw a syntax error. For inline comments, please use the '//' comment syntax. 

Additionally, these lines are referencing a variable, 'i', which has not been defined in the code. If there is more code not given here, please provide the rest of the script along with the spreadsheet.

Thanks,
Matt
Google Ads Scripts Team

ref:_00D1U1174p._5004Q217f6i:ref

Kai Yan Chan

unread,
Jun 18, 2020, 5:16:24 PM6/18/20
to Google Ads Scripts Forum
Hi Matt,

There is more code. I have left out the MCC account IDs and spreadsheet URL

function main() {
  
  //Enter Account IDs to iterate through
  var accountSelector = MccApp.accounts().withIds([]);
  
  var accountIterator = accountSelector.get();  
    while (accountIterator.hasNext()) {  
    var account = accountIterator.next();
      var accountName = account.getName();
  
      MccApp.select(account);

  // Shopping or regular campaigns
  // Use true if you want to run script on shopping campaigns (not regular campaigns).
  // Use false for regular campaigns.
  var shoppingCampaigns = false;
  
  
  // Optional parameters for filtering campaign names. The matching is case insensitive.
  // Select which campaigns to exclude e.g ["foo", "bar"] will ignore all campaigns
  // whose name contains 'foo' or 'bar'. Leave blank [] to not exclude any campaigns.
  var excludeCampaignNameContains = [];

  // Select which campaigns to include e.g ["foo", "bar"] will include only campaigns
  // whose name contains 'foo' or 'bar'. Leave blank [] to include all campaigns.
  var includeCampaignNameContains = [];
  
/**
 * Function to construct an iterator for shopping campaigns or regular campaigns.
 *
 * @param bool shoppingCampaigns Using shopping campaigns?
 * @return AdWords iterator Returns the corresponding AdWords iterator
 */
function ConstructIterator(shoppingCampaigns) {
  if (shoppingCampaigns === true) {
    return AdWordsApp.shoppingCampaigns();
  }
  return AdWordsApp.campaigns();
}
      
  // Spreadsheet where bid modifiers and states are defined
  var SPREADSHEET_URL = ""; 
  
  var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
  var sheet = spreadsheet.getActiveSheet();
  var data = sheet.getRange("A:D").getValues();
  var campaignIds = [];


 // Pull a list of all relevant campaign IDs in the account.
  var campaignSelector = ConstructIterator(shoppingCampaigns);
  for (var i = 0; i < excludeCampaignNameContains.length; i++) {
    campaignSelector = campaignSelector
      .withCondition('Name DOES_NOT_CONTAIN_IGNORE_CASE "' + excludeCampaignNameContains[i] + '"')
      .withCondition('CampaignStatus IN [ENABLED]');
  }

// add new list of multipliers          
  for (i in data) {
    //Skip the header row
    if(i == 0) { continue; }
    var campaign = data[i][0]
    var locationId = data[i][2];
    var bidModifier = data[i][3];
    //stop when you run out of data
    if(campaignName == "") { break; }
    else {
      var campaignIterator = campaignSelector.get();
      while (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next()
        var campaignName = campaign.getName();
        var includeCampaign = false;
        if (includeCampaignNameContains.length === 0) {
          includeCampaign = true;
        }
        for (var i = 0; i < includeCampaignNameContains.length; i++) {
          var index = campaignName.toLowerCase().indexOf(includeCampaignNameContains[i].toLowerCase());
          if (index !== -1) {
            includeCampaign = true;
            break;
          }
        }

        if (includeCampaign) {
          var campaignId = campaign.getId();
          campaignIds.push(campaignId);

          var currentlocationsIterator = campaign.targeting().targetedLocations().get();
          while (currentlocationsIterator.hasNext()) {
            var currenttargetedLocation = currentlocationsIterator.next();
            Logger.log(campaign + ' has removed' + currenttargetedLocation)
            currenttargetedLocation.remove();
            }
          
          if(locationId == "") { continue; }
          else {
            campaign.addLocation(locationId, bidModifier)
            Logger.log(campaign + ' has added' + locationId)
          }
        } 
      }

  // Return if there are no campaigns.
  if (campaignIds.length === 0) {
    Logger.log('There are no campaigns matching your criteria.');
    return;
  }
  
}

    continue;
  }
      }
    }
}

This is a sample of what the spreadsheet looks like with the campaign names blanked out:

Google Ads Scripts Forum Advisor

unread,
Jun 18, 2020, 9:46:18 PM6/18/20
to adwords...@googlegroups.com
Hi Kai,

Thanks for providing further details.

So that I can have a closer look at your issue, could you provide the CID, the name of the script and access to the spreadsheet that used in the script?

Regards,
Ejay
Reply all
Reply to author
Forward
0 new messages