I have been using the following script to pause groups that have keywords leading to out of stock pages. The script had been working great up until we switched over to a different 3rd party provider that appended new tracking strings at the end of our urls.Now when the script runs, it just says "skipped" for all the urls.
The issue is that I need the the script to split the url at different text strings depending on the url because there are several different url structures existing in the account.
For example, all of our urls contain either "&camp" or "?camp" which is where the 3rd party tracking string begins and need the script to split the url at the point EITHER of these text strings begin/
In other words, we’d want it to first get rid of
everything starting at “&camp” OR “?camp” and THEN get rid of anything
after “={“ if they still remain.
I am not familiar with javascript coding, so as much specifics as possible on how to fix this would be wonderful.
/************************************
* Item Out Of Stock Checker
* Version 1.1
* ChangeLog v1.1 - Filtered out deleted Campaigns and AdGroups
* Created By: Russ Savage
* FreeAdWordsScripts.com
***********************************/
var URL_LEVEL = 'Keyword'; // or Keyword
var ONLY_ACTIVE = true; // set to false for all ads or keywords
var CAMPAIGN_LABEL = 'Footwear'; // set this if you want to only check campaigns with this label
var STRIP_QUERY_STRING = true; // set this to false if the stuff that comes after the question mark is important
var WRAPPED_URLS = true; // set this to true if you use a 3rd party like Marin or Kenshoo for managing you account
// This is the specific text to search for
// on the page that indicates the item
// is out of stock.
var OUT_OF_STOCK_TEXT = 'searchhandler';
var OUT_OF_STOCK_TEXT2 = 'searchNoResults';
function main() {
var alreadyCheckedUrls = {};
var iter = buildSelector().get();
while(iter.hasNext()) {
var entity = iter.next();
var url = cleanUrl(entity.urls().getFinalUrl());
if(alreadyCheckedUrls[url]) {
if(alreadyCheckedUrls[url] === 'out of stock') {
entity.getAdGroup().pause();
} else {
entity.getAdGroup().enable();
}
} else {
var htmlCode;
try {
htmlCode = UrlFetchApp.fetch(url).getContentText();
} catch(e) {
Logger.log('There was an issue checking:'+url+', Skipping.');
continue;
}
if((htmlCode.indexOf(OUT_OF_STOCK_TEXT) >= 0) || (htmlCode.indexOf(OUT_OF_STOCK_TEXT2) >= 0)) {
alreadyCheckedUrls[url] = 'out of stock';
entity.getAdGroup().pause();
} else {
alreadyCheckedUrls[url] = 'in stock';
entity.getAdGroup().enable();
}
}
Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]);
}
}
function cleanUrl(url) {
if(WRAPPED_URLS) {
url = url.substr(url.lastIndexOf('http'));
if(decodeURIComponent(url) !== url) {
url = decodeURIComponent(url);
}
}
if(STRIP_QUERY_STRING) {
if(url.indexOf('&camp')>=0) {
url = url.split('&camp')[0];
}
}
if(url.indexOf('{') >= 0) {
//Let's remove the value track parameters
url = url.replace(/\{[0-9a-zA-Z]+\}/g,'');
}
return url;
}
function buildSelector() {
var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();
selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED');
if(ONLY_ACTIVE) {
selector = selector.withCondition('CampaignStatus = ENABLED').withCondition('Status = ENABLED');
if(URL_LEVEL !== 'Ad') {
selector = selector.withCondition('AdGroupStatus = ENABLED');
}
}
if(CAMPAIGN_LABEL) {
var label = AdWordsApp.labels().withCondition("Name = '"+CAMPAIGN_LABEL+"'").get().next();
var campIter = label.campaigns().get();
var campaignNames = [];
while(campIter.hasNext()) {
campaignNames.push(campIter.next().getName());
}
//selector = selector.withCondition("CampaignName IN ['"+campaignNames.join("','")+"']");
selector = selector.withCondition('CampaignName IN ["'+campaignNames.join('","')+'"]');
}
return selector;
}