Инструкция
Данный скрипт предназначен для проверки количества товаров в наличии на страницах категории, бренда или поиска. Если во время обработки страницы не было найдено ни одного заданного значения, скрипт возвращает null и группа объявлений будет остановлена.
При ответе сервера не равному 200 OK, объявление будет отправлено в отчет по битым ссылкам. Скрипт проверяет только активные объявления и записывает в отчет с битыми ссылками только объявления из активных групп объявлений. В случае редиректа группа не будет остановлена, данное решение принимает специалист.
Важно определить повторяющийся код страницы, который соответствует количеству товаров.
На примере сайта Comfy.ua определяем, что искомым текстом является data-content-instock.
Теперь в коде скрипта строка будет иметь следующий вид:
var countOOS = htmlCode.match(/data-content-instock/g || []);
В настройка скрипта задаем значения:
- Минимального количества товаров
- Ярлык кампаний
- Ссылку на Google Spreadsheet
- Название листа
- Ваш email
Таблица Google автоматически очищается с каждым запуском скрипта.
Исходный код
var URL_LEVEL = 'Ad';
var ONLY_ACTIVE = true; // Проверка только активных объявлений, извените на false для проверки всех
var CAMPAIGN_LABEL = 'Модели'; // Название ярлыка на уровне кампании
var GOODS = 3; // Минимальное количество товара на странице
function main() {
var TO = ['YOUR@EMAIL.COM'];
var ssUrl = 'https://docs.google.com/spreadsheets/'; // URL Таблицы Google
var ss = SpreadsheetApp.openByUrl(ssUrl);
var sheet = ss.getSheetByName('Sheet1');
sheet.clear();
var redirectedUrl = [];
var toStop = [];
var toEnable = [];
var alreadyCheckedUrls = {};
var params = {muteHttpExceptions:true, followRedirects: false};
var iter = buildSelector().get();
while(iter.hasNext()) {
var entity = iter.next();
var campaignName = entity.getCampaign().getName();
var adGroupName = entity.getAdGroup().getName();
var status = entity.getAdGroup().isEnabled();
var headline = entity.getHeadline();
var description1 = entity.getDescription1();
var description2 = entity.getDescription2();
var displayUrl = entity.getDisplayUrl();
var url = entity.urls().getFinalUrl();
if(alreadyCheckedUrls[url]) {
if(alreadyCheckedUrls[url] === 'out of stock') {
toStop.push(entity.getAdGroup());
} else {
toEnable.push(entity.getAdGroup());
}
} else {
var htmlCode;
var respCode;
var resp;
try {
resp = UrlFetchApp.fetch(url, params);
htmlCode = resp.getContentText();
respCode = resp.getResponseCode();
Logger.log('RespCode: ' + respCode);
} catch(e) {
Logger.log('There was an issue checking:'+url+', Skipping.' + e);
continue;
}
if (respCode === 200 ) {
//Logger.log('URL: ' + url);
var countOOS = htmlCode.match(/ТЕКСТ/g || []); //Повторяющийся текст страницы
if (countOOS === null) {
alreadyCheckedUrls[url] = 'out of stock';
toStop.push(entity.getAdGroup());
continue;
};
if (countOOS.length <= GOODS) {
alreadyCheckedUrls[url] = 'out of stock';
toStop.push(entity.getAdGroup());
} else {
alreadyCheckedUrls[url] = 'in stock';
toEnable.push(entity.getAdGroup());
}
Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]);
} else {
if (status) {
redirectedUrl.push([respCode,status,campaignName,adGroupName,headline,description1,description2,displayUrl,url]);
Logger.log('URL '+url+ ' has been pushed to array');
}
}
}
}
if (toStop !== undefined) {
for (var i = 0; toStop.length > i; i++){
toStop[i].pause();
};
};
if (toEnable !== undefined) {
for (var i = 0; toEnable.length > i; i++){
toEnable[i].enable();
};
};
sheet.getRange(1,1,redirectedUrl.length,9).setValues(redirectedUrl);
Logger.log(redirectedUrl.length);
if (redirectedUrl.length > 0) {
MailApp.sendEmail(TO, 'OOS Category - Название сайта', 'Отчет можно просмотреть по ссылке ' + ssUrl)};
}
function buildSelector() {
var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();
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("','")+"']");
}
return selector;
}