Инструкция

Данный скрипт предназначен для проверки количества товаров в наличии на страницах категории, бренда или поиска. Если во время обработки страницы не было найдено ни одного заданного значения, скрипт возвращает null и группа объявлений будет остановлена.

При ответе сервера не равному 200 OK, объявление будет отправлено в отчет по битым ссылкам. Скрипт проверяет только активные объявления и записывает в отчет с битыми ссылками только объявления из активных групп объявлений. В случае редиректа группа не будет остановлена, данное решение принимает специалист.

Важно определить повторяющийся код страницы, который соответствует количеству товаров.

На примере сайта Comfy.ua определяем, что искомым текстом является data-content-instock.

Пральні машини Bosch

Теперь в коде скрипта строка будет иметь следующий вид:

var countOOS = htmlCode.match(/data-content-instock/g || []);

В настройка скрипта задаем значения:

Таблица 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;
}