TypeError: Cannot read property 'split' of undefined

206 views
Skip to first unread message

James G

unread,
Jan 10, 2022, 10:28:52 AM1/10/22
to Google Ads Scripts Forum
Hi all,

I'm trying to implement the single account version of the weather bidding script and I'm getting the following error;

TypeError: Cannot read property 'split' of undefined at Array.matchesBelow (Code:310:30) at evaluateMatchRules (Code:294:17) at evaluateWeatherRules (Code:275:7) at applyRulesForCampaign (Code:222:9) at main (Code:75:5)

Aside from the Spreadsheet URL replacement & the API key, I haven't made any changes to the script.

Any help appreciated.

Thanks

// Copyright 2015, Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @name Bid By Weather
 *
 * @overview The Bid By Weather script adjusts campaign bids by weather
 *     conditions of their associated locations. See
 *     https://developers.google.com/google-ads/scripts/docs/solutions/weather-based-campaign-management#bid-by-weather
 *     for more details.
 *
 * @author Google Ads Scripts Team [adwords...@googlegroups.com]
 *
 * @version 1.2.2
 *
 * @changelog
 * - version 1.2.2
 *   - Add support for video and shopping campaigns.
 * - version 1.2.1
 *   - Added validation for external spreadsheet setup.
 * - version 1.2
 *   - Added proximity based targeting.  Targeting flag allows location
 *     targeting, proximity targeting or both.
 * - version 1.1
 *   - Added flag allowing bid adjustments on all locations targeted by
 *     a campaign rather than only those that match the campaign rule
 * - version 1.0
 *   - Released initial version.
 */

// Register for an API key at http://openweathermap.org/appid
// and enter the key below.
var OPEN_WEATHER_MAP_API_KEY = '------';

// Create a copy of https://goo.gl/A59Uuc and enter the URL below.
var SPREADSHEET_URL = '-----';

// A cache to store the weather for locations already lookedup earlier.
var WEATHER_LOOKUP_CACHE = {};

// Flag to pick which kind of targeting "LOCATION", "PROXIMITY", or "ALL".
var TARGETING = 'ALL';


/**
 * The code to execute when running the script.
 */
function main() {
  validateApiKey();
  // Load data from spreadsheet.
  var spreadsheet = validateAndGetSpreadsheet(SPREADSHEET_URL);
  var campaignRuleData = getSheetData(spreadsheet, 1);
  var weatherConditionData = getSheetData(spreadsheet, 2);
  var geoMappingData = getSheetData(spreadsheet, 3);

  // Convert the data into dictionaries for convenient usage.
  var campaignMapping = buildCampaignRulesMapping(campaignRuleData);
  var weatherConditionMapping =
      buildWeatherConditionMapping(weatherConditionData);
  var locationMapping = buildLocationMapping(geoMappingData);

  // Apply the rules.
  for (var campaignName in campaignMapping) {
    applyRulesForCampaign(campaignName, campaignMapping[campaignName],
        locationMapping, weatherConditionMapping);
  }
}

/**
 * Retrieves the data for a worksheet.
 *
 * @param {Object} spreadsheet The spreadsheet.
 * @param {number} sheetIndex The sheet index.
 * @return {Array} The data as a two dimensional array.
 */
function getSheetData(spreadsheet, sheetIndex) {
  var sheet = spreadsheet.getSheets()[sheetIndex];
  var range =
      sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
  return range.getValues();
}

/**
 * Builds a mapping between the list of campaigns and the rules
 * being applied to them.
 *
 * @param {Array} campaignRulesData The campaign rules data, from the
 *     spreadsheet.
 * @return {!Object.<string, Array.<Object>> } A map, with key as campaign name,
 *     and value as an array of rules that apply to this campaign.
 */
function buildCampaignRulesMapping(campaignRulesData) {
  var campaignMapping = {};
  for (var i = 0; i < campaignRulesData.length; i++) {
    // Skip rule if not enabled.

    if (campaignRulesData[i][5].toLowerCase() == 'yes') {
      var campaignName = campaignRulesData[i][0];
      var campaignRules = campaignMapping[campaignName] || [];
      campaignRules.push({
          'name': campaignName,

          // location for which this rule applies.
          'location': campaignRulesData[i][1],

          // the weather condition (e.g. Sunny).
          'condition': campaignRulesData[i][2],

          // bid modifier to be applied.
          'bidModifier': campaignRulesData[i][3],

          // whether bid adjustments should by applied only to geo codes
          // matching the location of the rule or to all geo codes that
          // the campaign targets.
          'targetedOnly': campaignRulesData[i][4].toLowerCase() ==
                          'matching geo targets'
      });
      campaignMapping[campaignName] = campaignRules;
    }
  }
  Logger.log('Campaign Mapping: %s', campaignMapping);
  return campaignMapping;
}

/**
 * Builds a mapping between a weather condition name (e.g. Sunny) and the rules
 * that correspond to that weather condition.
 *
 * @param {Array} weatherConditionData The weather condition data from the
 *      spreadsheet.
 * @return {!Object.<string, Array.<Object>>} A map, with key as a weather
 *     condition name, and value as the set of rules corresponding to that
 *     weather condition.
 */
function buildWeatherConditionMapping(weatherConditionData) {
  var weatherConditionMapping = {};

  for (var i = 0; i < weatherConditionData.length; i++) {
    var weatherConditionName = weatherConditionData[i][0];
    weatherConditionMapping[weatherConditionName] = {
      // Condition name (e.g. Sunny)
      'condition': weatherConditionName,

      // Temperature (e.g. 50 to 70)
      'temperature': weatherConditionData[i][1],

      // Precipitation (e.g. below 70)
      'precipitation': weatherConditionData[i][2],

      // Wind speed (e.g. above 5)
      'wind': weatherConditionData[i][3]
    };
  }
  Logger.log('Weather condition mapping: %s', weatherConditionMapping);
  return weatherConditionMapping;
}

/**
 * Builds a mapping between a location name (as understood by OpenWeatherMap
 * API) and a list of geo codes as identified by Google Ads scripts.
 *
 * @param {Array} geoTargetData The geo target data from the spreadsheet.
 * @return {!Object.<string, Array.<Object>>} A map, with key as a locaton name,
 *     and value as an array of geo codes that correspond to that location
 *     name.
 */
function buildLocationMapping(geoTargetData) {
  var locationMapping = {};
  for (var i = 0; i < geoTargetData.length; i++) {
    var locationName = geoTargetData[i][0];
    var locationDetails = locationMapping[locationName] || {
      'geoCodes': []      // List of geo codes understood by Google Ads scripts.
    };

    locationDetails.geoCodes.push(geoTargetData[i][1]);
    locationMapping[locationName] = locationDetails;
  }
  Logger.log('Location Mapping: %s', locationMapping);
  return locationMapping;
}

/**
 * Applies rules to a campaign.
 *
 * @param {string} campaignName The name of the campaign.
 * @param {Object} campaignRules The details of the campaign. See
 *     buildCampaignMapping for details.
 * @param {Object} locationMapping Mapping between a location name (as
 *     understood by OpenWeatherMap API) and a list of geo codes as
 *     identified by Google Ads scripts. See buildLocationMapping for details.
 * @param {Object} weatherConditionMapping Mapping between a weather condition
 *     name (e.g. Sunny) and the rules that correspond to that weather
 *     condition. See buildWeatherConditionMapping for details.
 */
function applyRulesForCampaign(campaignName, campaignRules, locationMapping,
                               weatherConditionMapping) {
  for (var i = 0; i < campaignRules.length; i++) {
    var bidModifier = 1;
    var campaignRule = campaignRules[i];

    // Get the weather for the required location.
    var locationDetails = locationMapping[campaignRule.location];
    var weather = getWeather(campaignRule.location);
    Logger.log('Weather for %s: %s', locationDetails, weather);

    // Get the weather rules to be checked.
    var weatherConditionName = campaignRule.condition;
    var weatherConditionRules = weatherConditionMapping[weatherConditionName];

    // Evaluate the weather rules.
    if (evaluateWeatherRules(weatherConditionRules, weather)) {
      Logger.log('Matching Rule found: Campaign Name = %s, location = %s, ' +
          'weatherName = %s,weatherRules = %s, noticed weather = %s.',
          campaignRule.name, campaignRule.location,
          weatherConditionName, weatherConditionRules, weather);
      bidModifier = campaignRule.bidModifier;

      if (TARGETING == 'LOCATION' || TARGETING == 'ALL') {
        // Get the geo codes that should have their bids adjusted.
        var geoCodes = campaignRule.targetedOnly ?
          locationDetails.geoCodes : null;
        adjustBids(campaignName, geoCodes, bidModifier);
      }

      if (TARGETING == 'PROXIMITY' || TARGETING == 'ALL') {
        var location = campaignRule.targetedOnly ? campaignRule.location : null;
        adjustProximityBids(campaignName, location, bidModifier);
      }

    }
  }
  return;
}

/**
 * Converts a temperature value from kelvin to fahrenheit.
 *
 * @param {number} kelvin The temperature in Kelvin scale.
 * @return {number} The temperature in Fahrenheit scale.
 */
function toFahrenheit(kelvin) {
  return (kelvin - 273.15) * 1.8 + 32;
}

/**
 * Evaluates the weather rules.
 *
 * @param {Object} weatherRules The weather rules to be evaluated.
 * @param {Object.<string, string>} weather The actual weather.
 * @return {boolean} True if the rule matches current weather conditions,
 *     False otherwise.
 */
function evaluateWeatherRules(weatherRules, weather) {
  // See https://openweathermap.org/weather-data
  // for values returned by OpenWeatherMap API.
  var precipitation = 0;
  if (weather.rain && weather.rain['3h']) {
    precipitation = weather.rain['3h'];
  }
  var temperature = toFahrenheit(weather.main.temp);
  var windspeed = weather.wind.speed;

  return evaluateMatchRules(weatherRules.temperature, temperature) &&
      evaluateMatchRules(weatherRules.precipitation, precipitation) &&
      evaluateMatchRules(weatherRules.wind, windspeed);
}

/**
 * Evaluates a condition for a value against a set of known evaluation rules.
 *
 * @param {string} condition The condition to be checked.
 * @param {Object} value The value to be checked.
 * @return {boolean} True if an evaluation rule matches, false otherwise.
 */
function evaluateMatchRules(condition, value) {
  // No condition to evaluate, rule passes.
  if (condition == '') {
    return true;
  }
  var rules = [matchesBelow, matchesAbove, matchesRange];

  for (var i = 0; i < rules.length; i++) {
    if (rules[i](condition, value)) {
      return true;
    }
  }
  return false;
}

/**
 * Evaluates whether a value is below a threshold value.
 *
 * @param {string} condition The condition to be checked. (e.g. below 50).
 * @param {number} value The value to be checked.
 * @return {boolean} True if the value is less than what is specified in
 * condition, false otherwise.
 */
function matchesBelow(condition, value) {
  conditionParts = condition.split(' ');

  if (conditionParts.length != 2) {
    return false;
  }

  if (conditionParts[0] != 'below') {
    return false;
  }

  if (value < conditionParts[1]) {
    return true;
  }
  return false;
}

/**
 * Evaluates whether a value is above a threshold value.
 *
 * @param {string} condition The condition to be checked. (e.g. above 50).
 * @param {number} value The value to be checked.
 * @return {boolean} True if the value is greater than what is specified in
 *     condition, false otherwise.
 */
function matchesAbove(condition, value) {
  conditionParts = condition.split(' ');

  if (conditionParts.length != 2) {
    return false;
  }

  if (conditionParts[0] != 'above') {
    return false;
  }

  if (value > conditionParts[1]) {
    return true;
  }
  return false;
}

/**
 * Evaluates whether a value is within a range of values.
 *
 * @param {string} condition The condition to be checked (e.g. 5 to 18).
 * @param {number} value The value to be checked.
 * @return {boolean} True if the value is in the desired range, false otherwise.
 */
function matchesRange(condition, value) {
  conditionParts = condition.replace('\w+', ' ').split(' ');

  if (conditionParts.length != 3) {
    return false;
  }

  if (conditionParts[1] != 'to') {
    return false;
  }

  if (conditionParts[0] <= value && value <= conditionParts[2]) {
    return true;
  }
  return false;
}

/**
 * Retrieves the weather for a given location, using the OpenWeatherMap API.
 *
 * @param {string} location The location to get the weather for.
 * @return {Object.<string, string>} The weather attributes and values, as
 *     defined in the API.
 */
function getWeather(location) {
  if (location in WEATHER_LOOKUP_CACHE) {
    Logger.log('Cache hit...');
    return WEATHER_LOOKUP_CACHE[location];
  }

  var url = Utilities.formatString(
      'http://api.openweathermap.org/data/2.5/weather?APPID=%s&q=%s',
      encodeURIComponent(OPEN_WEATHER_MAP_API_KEY),
      encodeURIComponent(location));
  var response = UrlFetchApp.fetch(url);
  if (response.getResponseCode() != 200) {
    throw Utilities.formatString(
        'Error returned by API: %s, Location searched: %s.',
        response.getContentText(), location);
  }

  var result = JSON.parse(response.getContentText());

  // OpenWeatherMap's way of returning errors.
  if (result.cod != 200) {
    throw Utilities.formatString(
        'Error returned by API: %s,  Location searched: %s.',
        response.getContentText(), location);
  }

  WEATHER_LOOKUP_CACHE[location] = result;
  return result;
}

/**
 * Adjusts the bidModifier for a list of geo codes for a campaign.
 *
 * @param {string} campaignName The name of the campaign.
 * @param {Array} geoCodes The list of geo codes for which bids should be
 *     adjusted.  If null, all geo codes on the campaign are adjusted.
 * @param {number} bidModifier The bid modifier to use.
 */
function adjustBids(campaignName, geoCodes, bidModifier) {
  // Get the campaign.
  var campaign = getCampaign(campaignName);
  if (!campaign) return null;

  // Get the targeted locations.
  var locations = campaign.targeting().targetedLocations().get();
  while (locations.hasNext()) {
    var location = locations.next();
    var currentBidModifier = location.getBidModifier().toFixed(2);

    // Apply the bid modifier only if the campaign has a custom targeting
    // for this geo location or if all locations are to be modified.
    if (!geoCodes || (geoCodes.indexOf(location.getId()) != -1 &&
      currentBidModifier != bidModifier)) {
        Logger.log('Setting bidModifier = %s for campaign name = %s, ' +
            'geoCode = %s. Old bid modifier is %s.', bidModifier,
            campaignName, location.getId(), currentBidModifier);
        location.setBidModifier(bidModifier);
    }
  }
}

/**
 * Adjusts the bidModifier for campaigns targeting by proximity location
 * for a given weather location.
 *
 * @param {string} campaignName The name of the campaign.
 * @param {string} weatherLocation The weather location for which bids should be
 *     adjusted.  If null, all proximity locations on the campaign are adjusted.
 * @param {number} bidModifier The bid modifier to use.
 */
function adjustProximityBids(campaignName, weatherLocation, bidModifier) {
  // Get the campaign.
  var campaign = getCampaign(campaignName);
  if(campaign === null) return;

  // Get the proximity locations.
  var proximities = campaign.targeting().targetedProximities().get();
  while (proximities.hasNext()) {
    var proximity = proximities.next();
    var currentBidModifier = proximity.getBidModifier().toFixed(2);

    // Apply the bid modifier only if the campaign has a custom targeting
    // for this geo location or if all locations are to be modified.
    if (!weatherLocation ||
        (weatherNearProximity(proximity, weatherLocation) &&
      currentBidModifier != bidModifier)) {
        Logger.log('Setting bidModifier = %s for campaign name = %s, with ' +
            'weatherLocation = %s in proximity area. Old bid modifier is %s.',
            bidModifier, campaignName, weatherLocation, currentBidModifier);
        proximity.setBidModifier(bidModifier);
      }
  }
}

/**
 * Checks if weather location is within the radius of the proximity location.
 *
 * @param {Object} proximity The targeted proximity of campaign.
 * @param {string} weatherLocation Name of weather location to check within
 * radius.
 * @return {boolean} Returns true if weather location is within radius.
 */
function weatherNearProximity(proximity, weatherLocation) {
  // See https://en.wikipedia.org/wiki/Haversine_formula for details on how
  // to compute spherical distance.
  var earthRadiusInMiles = 3960.0;
  var degreesToRadians = Math.PI / 180.0;
  var radiansToDegrees = 180.0 / Math.PI;
  var kmToMiles = 0.621371;

  var radiusInMiles = proximity.getRadiusUnits() == 'MILES' ?
    proximity.getRadius() : proximity.getRadius() * kmToMiles;

  // Compute the change in latitude degrees for the radius.
  var deltaLat = (radiusInMiles / earthRadiusInMiles) * radiansToDegrees;
  // Find the radius of a circle around the earth at given latitude.
  var r = earthRadiusInMiles * Math.cos(proximity.getLatitude() *
      degreesToRadians);
  // Compute the change in longitude degrees for the radius.
  var deltaLon = (radiusInMiles / r) * radiansToDegrees;

  // Retrieve weather location for lat/lon coordinates.
  var weather = getWeather(weatherLocation);
  // Check if weather condition is within the proximity boundaries.
  return (weather.coord.lat >= proximity.getLatitude() - deltaLat &&
          weather.coord.lat <= proximity.getLatitude() + deltaLat &&
          weather.coord.lon >= proximity.getLongitude() - deltaLon &&
          weather.coord.lon <= proximity.getLongitude() + deltaLon);
}

/**
 * Finds a campaign by name, whether it is a regular, video, or shopping
 * campaign, by trying all in sequence until it finds one.
 *
 * @param {string} campaignName The campaign name to find.
 * @return {Object} The campaign found, or null if none was found.
 */
function getCampaign(campaignName) {
  var selectors = [AdsApp.campaigns(), AdsApp.videoCampaigns(),
      AdsApp.shoppingCampaigns()];
  for(var i = 0; i < selectors.length; i++) {
    var campaignIter = selectors[i].
        withCondition('CampaignName = "' + campaignName + '"').
        get();
    if (campaignIter.hasNext()) {
      return campaignIter.next();
    }
  }
  return null;
}

/**
 * DO NOT EDIT ANYTHING BELOW THIS LINE.
 * Please modify your spreadsheet URL and API key at the top of the file only.
 */

/**
 * Validates the provided spreadsheet URL to make sure that it's set up
 * properly. Throws a descriptive error message if validation fails.
 *
 * @param {string} spreadsheeturl The URL of the spreadsheet to open.
 * @return {Spreadsheet} The spreadsheet object itself, fetched from the URL.
 * @throws {Error} If the spreadsheet URL hasn't been set
 */
function validateAndGetSpreadsheet(spreadsheeturl) {
  if (spreadsheeturl == 'INSERT_SPREADSHEET_URL_HERE') {
    throw new Error('Please specify a valid Spreadsheet URL. You can find' +
        ' a link to a template in the associated guide for this script.');
  }
  var spreadsheet = SpreadsheetApp.openByUrl(spreadsheeturl);
  return spreadsheet;
}

/**
 * Validates the provided API key to make sure that it's not the default. Throws
 * a descriptive error message if validation fails.
 *
 * @throws {Error} If the configured API key hasn't been set.
 */
function validateApiKey() {
  if (OPEN_WEATHER_MAP_API_KEY == 'INSERT_OPEN_WEATHER_MAP_API_KEY_HERE') {
    throw new Error('Please specify a valid API key for OpenWeatherMap. You ' +
        'can acquire one here: http://openweathermap.org/appid');
  }
}


Google Ads Scripts Forum Advisor

unread,
Jan 11, 2022, 2:02:27 AM1/11/22
to adwords...@googlegroups.com

Hello James,

 

I'm Michael from Google Ads scripts Team, thank you for reaching out to us.

 

Would you be able to share to following information for further investigation?

  • Customer ID / CID
  • Scriptname
  • Shareable link to the template sheet
  • Screenshot of the issue

 

You may send the requested details privately via "Reply To Author" button.

Regards,

Google Logo
Michael Angelo Legaspi
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref

James G

unread,
Jan 11, 2022, 5:32:54 AM1/11/22
to Google Ads Scripts Forum
Hi there Michael,

Thanks for getting back to me!

I don't appear to have the requisite permissions to Reply Directly unfortunately for some reason.

Please advise!

Thanks


Google Ads Scripts Forum Advisor

unread,
Jan 11, 2022, 9:58:23 PM1/11/22
to adwords...@googlegroups.com

Hello James,

 

You may send the requested details directly to googleadsscr...@google.com instead. Let us know here once the information has been sent.

Regards,

Google Ads Scripts Forum Advisor

unread,
Jan 13, 2022, 5:35:23 AM1/13/22
to adwords...@googlegroups.com
Hi James,

Thanks for requested information. Harry here, I work with Michael.

I checked your script and it appears that the implementation and spreadsheet configuration is fine. The reason that the script didn’t update the bid modifier is because the weather condition that you have set did not met the actual weather condition returned by OpenWeatherMap API as seen on your scripts logs. Once the weather condition has been met, the script should execute to update the campaign’s bid modifier. On the other hand, if the script made the bid changes but was not reflected to your campaigns, please let me know so I can further investigate.

Let me know if you have further questions or need more help.

Thanks,
Google Logo
Harry Cliford Rivera
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref

James Galilee

unread,
Jan 13, 2022, 8:19:13 AM1/13/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi there Harry,

Thanks for getting back to me.

I'm a bit confused, I believe there is a modifier for both above, and below 5 degrees - So shouldn't it have done something if either was met?

I'm also now getting the split read property error again when running the preview;

image.png

Any advice appreciated :)

Thanks


Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.


--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/adwords-scripts/BSrNc000000000000000000000000000000000000000000000R5N9ES00ScO1Jhg7Sx6UBPkOz3bK8A%40sfdc.net.

Google Ads Scripts Forum Advisor

unread,
Jan 14, 2022, 12:48:55 AM1/14/22
to adwords...@googlegroups.com
Hi James,

I work along with Harry. Allow me to assist you in this.

The reason that the script didn't make a bid modifier adjustment is due to the fact that it has a runtime error. As per checking with your spreadsheet template, it appears that you deleted the other fields on the Weather Condition sheet which causes an issue. That said, we would recommend to make a new copy of the spreadsheet template once again, then re-setup your weather conditions. Kindly avoid removing other fields that you won't use, and just leave them blank instead.

Regards,
Google Logo
Teejay Wennie Pimentel
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref

James Galilee

unread,
Jan 14, 2022, 6:13:37 AM1/14/22
to Google Ads Scripts Forum on behalf of adsscripts
Hey Teejay,

Thanks for getting back to me.

Quick question - What do I do if I don't want the script to make adjustments based on the rain or wind?

As a test I have tried adding the columns back in, and set the values so they trigger based on the current weather and it still isn't making any changes;

image.png

image.png

Any advice appreciated!

Thanks
Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Jan 16, 2022, 11:12:57 PM1/16/22
to adwords...@googlegroups.com
Hi James,

Thank you for getting back to us.

With regard to your use case inquiry, you just need to leave the precipitation and wind column blank. 

James Galilee

unread,
Jan 18, 2022, 8:35:25 AM1/18/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi there Teeay,

Thanks for clarifying, that makes sense.

I've left the columns blank, and now we have a new error;

image.png

Any thoughts?

Cheers

Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Jan 18, 2022, 9:39:59 PM1/18/22
to adwords...@googlegroups.com
Hi James,

Thanks for replying back. Harry here, allow me to assist you further.

The issue you have just encountered is caused by the Google Ads Scripts Beta not supporting video campaigns yet. Please see beta information for your reference. You should be able to resolve the issue by either excluding video campaigns in your weather script or turning off the 'New scripts experience' toggle for your script. For new updates and releases in scripts, please check out our blog.

Let me know if you need anything else.

Thanks,
Google Logo
Harry Cliford Rivera
Google Ads Scripts Team
https://


ref:_00D1U1174p._5004Q2UiQ0K:ref

James Galilee

unread,
Jan 19, 2022, 5:30:35 AM1/19/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi Harry,

Thanks for your response.

I'm not sure I understand - The script isn't targeting any video campaigns, is it solely because there are video campaigns in the account?

Either way, I have tested with the new experience turned off - It seems to find a matching rule and then fail to make any changes;

image.png

Please advise!

Kind regards
Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Jan 20, 2022, 4:04:44 AM1/20/22
to adwords...@googlegroups.com
Hi James,

Thanks for getting back. Could you kindly provide more context as to how the script failed to make any changes even with having a rule found? Were there no entries showed in the CHANGES tab upon previewing the script? I do believe that the script won't display messages in the LOGS tab regarding made changes. Also, please be advised that certain code will not execute the same way of actually executing the script as no objects get created, deleted, or modified when previewing a script. Please see Preview Mode for your reference.

Let me know your thoughts or if you have further questions on this.


Thanks,
Google Logo
Harry Cliford Rivera
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref

James Galilee

unread,
Jan 21, 2022, 6:38:00 AM1/21/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi Harry,

Yes that's correct, there were no changes made in the changes tab.

I've also run the script properly, without changes;

Screenshot 2022-01-21 at 11.37.08.png

Any help appreciated.

Thanks
Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Jan 23, 2022, 11:27:39 PM1/23/22
to adwords...@googlegroups.com
Hi James,

Thanks for your response. It would seem that you are pointing to both the Bidding and Generic versions of the Weather-based Campaign Management solution script as I have noticed that the two latest screenshots you have referenced shows two different scripts of yours: (1) Weather Script - Test which is the generic script version and (2) Bid Modifier - Weather Script - Spreadsheet that is the bidding script version. Please do consider and be advised that although they perform the same goal, they are used in a different approach; hence, expected results would vary and how you would address issues for each script.

Nevertheless, I would really appreciate it if you can specifically identify which script you are concerned or having issues with so I can guide you without causing any further confusion. Kindly consider following points for each of your scripts.
  • Weather Script - Test (Generic)
    • It seems that this script shows 'No changes' and would not continue to run as expected because it returned an error pointing to line 85 of your script (see attached screenshot). 
    • You would have to first store the value from the getCpc method in a variable so you could you use the multiplication assignment operator. Please see code below for your reference.
    •   var cpc = adGroup.bidding().getCpc();
        adGroup.bidding().setCpc(cpc *= 1.2);
      
    • From there, kindly try to run your script again and let me know how it goes.
  • Bid Modifier - Weather Script - Spreadsheet (Bidding)
    • Upon preview, kindly check if a rule has been found shown in the LOGS tab and if there would be entries under the CHANGES tab.
    • If you are satisfied with the results thereafter, you can have the script to run so that you could apply the results you got upon preview onto your account.
    • In any case, you can schedule your script based on your requirement.
    • If you have noticed that changes were recorded upon actual script executions but the changes did not reflect in your account, please let me know so I can have that investigated further.
Additionally, I am emphasizing the use of the Preview Mode (PREVIEW button) and having to actually execute your scripts via the RUN option. No objects get created, deleted, or modified during preview. As a consequence, certain code will not execute the same way when previewed.

Let me know your thoughts or if you have questions.
84jpdufxuXW5USg (1).png

James Galilee

unread,
Jan 26, 2022, 5:37:58 AM1/26/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi Harry,

Thanks for your response.

To clarify, I am not referring to the test script - I am referring to [Bid Modifier - Weather Script - Spreadsheet (Bidding)]

To reiterate, there are no changes in the 'changes' tab when running via preview.


Screenshot 2022-01-26 at 10.35.48.png
Screenshot 2022-01-26 at 10.36.20.png

Please advise.

Thanks!



Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 16 Blackfriars Street, Manchester, M3 5BQ, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Jan 26, 2022, 11:52:56 PM1/26/22
to adwords...@googlegroups.com
Hi James,

Thanks for getting back. Would you be able to try to execute the script via the RUN option and/or schedule the script accordingly and let me know how that goes? I can further my investigation with results you'll get and raise this with the team if the script is still unable to make changes even with satisfied weather conditions.

James Galilee

unread,
Jan 31, 2022, 8:10:15 AM1/31/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi Harry,

Tried to run without preview;

image.png

image.png

No changes, as with the preview.

Please escalate to the team, as still no luck!

Thanks
Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 129A Liverpool Road, Manchester, M3 4JN, United Kingdom.


--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Feb 2, 2022, 11:05:07 PM2/2/22
to adwords...@googlegroups.com
Hi James,

I work along with Harry. Allow me to assist you in this.

I've scrutinized your script and spreadsheet and was able to find the culprit. It appears that the spreadsheet's campaign contains a newline (please see attached screenshot) which is the reason that script wasn't able to find the campaign in your ads account to make a bid modifier. Please do note that this field is case sensitive and will cause this kind of behavior if were mistakenly inputted. Removing the newline should fixed the issue.

Regards,
Google Logo
Teejay Wennie Pimentel
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref
spreadsheet.png

James Galilee

unread,
Feb 7, 2022, 9:32:07 AM2/7/22
to Google Ads Scripts Forum on behalf of adsscripts
Hi Teejay,

I see - That's a very pesky issue, well spotted!

It seems to be triggering the script now, thanks very much for your help!

Kind regards
Clickoo logo
James Galilee
Head of Growth
Twitter icon  Facebook icon  Linkedin icon
 
Subject to Contract: neither this nor any other email(s) sent or received on behalf of Clickoo Ltd will form or form part of or give rise to a legally binding agreement. Legally binding agreements may be concluded on behalf of Clickoo Ltd only by C-level executives/directors and only by means of a single document signed by that person which expressly states that it contains all terms of an agreement and that it is binding as a contract. None of our other officers, employees or agents are authorised to enter into any binding agreement with another party by email or other means without the express written confirmation of an authorised signatory. -- This email and any attachments are confidential (unless expressly stated otherwise) and are not intended to be read by any person other than the addressee(s). If you are not an addressee or authorised to act on their behalf, do not read, print, re-transmit, or store this email, any information contained in it, or any attachments. If you are not an addressee, do not act in reliance upon the content of the email or any attachments. If you have received this email in error, please contact us on he...@clickoo.co.uk to inform us of the error and then permanently delete this email. -- Any and all emails sent to us may be monitored and/or stored by us to ensure compliance with relevant legislation, rules, and policies. All communications are handled in full compliance with current data protection legislation in force in England and Wales including, but not limited to, the UK GDPR. For further information, please refer to our Privacy Policy https://clickoo.co.uk/privacy-policy/ and our website Terms and Conditions https://clickoo.co.uk/terms-conditions/. Computer viruses and other malware can be transmitted by email. Emails may also be intercepted by unauthorised third parties. It is your responsibility to ensure that you have in place suitable internet security measures, including scanning incoming emails and attachments for viruses. Clickoo Ltd accepts no responsibility for any viruses or other malware transmitted in this email or any attachments, or for any alteration or corruption that may occur during transmission. The name Clickoo, and the Clickoo logo are trademarks of Clickoo Ltd. Company registered in England & Wales No. 06978447, registered office: 129A Liverpool Road, Manchester, M3 4JN, United Kingdom.

--
-- You received this message because you are subscribed to the Google Groups AdWords Scripts Forum group. Please do not reply to this email. To post to this group or unsubscribe please visit https://developers.google.com/adwords/scripts/community.
---
You received this message because you are subscribed to a topic in the Google Groups "Google Ads Scripts Forum" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/adwords-scripts/TAtaGQYWpow/unsubscribe.
To unsubscribe from this group and all its topics, send an email to adwords-scrip...@googlegroups.com.

Google Ads Scripts Forum Advisor

unread,
Feb 8, 2022, 1:09:30 AM2/8/22
to adwords...@googlegroups.com

Hello James,

 

Please let us know if you have any other concerns or if you need further assistance from our team. We’re happy to assist you.

 

Regards,

Google Logo
James Howell Abarsoza
Google Ads Scripts Team
 


ref:_00D1U1174p._5004Q2UiQ0K:ref
Reply all
Reply to author
Forward
0 new messages