Сейчас в сети: 437
Советы и вопросы по использованию скриптов AdWords
Подсказки
star_border
Ответить

Скрипт "Для обновления цены в объявлении"

Студент ✭ ✭

Привет всем!

Не работает скрипт для обновления цены.Вот сам скрипт:

var URL_LEVEL = 'Ad'; // Ad or Keyword
var ONLY_ACTIVE = false; // set to false for all ads or keywords
var CAMPAIGN_LABEL = ''; // 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 LABEL_NAMES = ['"test"'];
var OUT_OF_STOCK_TEXT = 'Нет в наличии';
var PRICE_TEXT_BEGIN = '<span class="price-oth">';
var PRICE_TEXT_END = ' грн</span>';
var keywords = {};
 
function setKeywordPrice(keyword, price) {
  var keywordId = keyword.getId();
  if (keywords[keywordId]) {} else {
    Logger.log('Keyword: '+keyword+', Price: '+price);
    keyword.setAdParam(1, price);
    keywords[keywordId] = true;
  }
}

function setAdPrice(ad, price) {
  var keywords = ad.getAdGroup().keywords().get();
  while(keywords.hasNext()) {
    var keyword = keywords.next();
    setKeywordPrice(keyword, price);
    //Logger.log('Ad: '+ad+'; Price: '+price+'; Keyword: '+keyword);
  }
}

function main() {
  var alreadyCheckedUrls = {};
  var prices = {};
  var campIter = AdWordsApp.campaigns().get();
  while (campIter.hasNext()) {
    var camp = campIter.next();
  var adIter = buildSelector(camp, 'Ad');
  adIter = adIter.withCondition('LabelNames CONTAINS_ANY [' + LABEL_NAMES.join(',') + ']');
  adIter = adIter.get();
  //Logger.log(iter.totalNumEntities());
  while(adIter.hasNext()) {
      var entity = adIter.next();
      var url = entity.urls().getFinalUrl();
      if (url === null)
          continue;
      url = cleanUrl(url);
      if (prices[url]) {
        setAdPrice(entity, prices[url]);
        //Logger.log('Url: '+url+'; Price: '+prices[url]+'; Entity: '+entity);
      } else {
        var htmlCode;
        try {
          htmlCode = UrlFetchApp.fetch(url).getContentText();
        } catch(e) {
          Logger.log('There was an issue checking:'+url+', Skipping.');
          continue;
        }
        var priceStart = htmlCode.indexOf(PRICE_TEXT_BEGIN) + PRICE_TEXT_BEGIN.length;
        if(priceStart >= 0) {
          var priceEnd = htmlCode.indexOf(PRICE_TEXT_END, priceStart);
          prices[url] = htmlCode.substr(priceStart, priceEnd - priceStart).replace(/\D/, '');
          //setKeywordPrice(keyword, prices[url]);
          setAdPrice(entity, prices[url]);
          //Logger.log('Url: '+url+'; Price: '+prices[url]+'; Entity: '+entity);
        }
      }
      //Logger.log('Url: '+url+' price is '+prices[url]);
      
      if(alreadyCheckedUrls[url]) {
        if(alreadyCheckedUrls[url] === 'out of stock') {
          entity.pause();
          //keyword.pause();
        } else {
          entity.enable();
          //keyword.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) {
          alreadyCheckedUrls[url] = 'out of stock';
          entity.pause();
        } else {
          alreadyCheckedUrls[url] = 'in stock';
          entity.enable();
        }
        Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]+'; price: '+prices[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('?')>=0) {
      url = url.split('?')[0];
    }
  }
  if(url.indexOf('{') >= 0) {
    //Let's remove the value track parameters
    url = url.replace(/\{[0-9a-zA-Z]+\}/g,'');
  }
  return url;
}
 
function buildSelector(camp, url_level) {
  var selector = (url_level === 'Ad') ? camp.ads() : camp.keywords();
  return selector;
}

Ярлыки вставила, актуальную цену с сайта тоже.

При просмотре - выдает 3 одинаковые ошибки - http://prntscr.com/aduc84 - "Value is too short".

Помогите исправить!

 

 

 

1 Ответ экспертаverified_user

Утвержденные решения
Лучший ответ.
Решение
Утвердил автор темы Katya P
марта 2016

Re: Скрипт "Для обновления цены в объявлении"

Восходящие звезды

У Вас там немного лишнего текста. Уберите из настройки то, что зачеркнуто в скриншоте:

 

3f8bf-clip-78kb.png

---------
С уважением Олег Поддубный

Просмотреть решение в исходном сообщении


Все ответы

Re: Скрипт "Для обновления цены в объявлении"

Восходящие звезды
Напишите, пожалуйста сайт, с которого Вы копируете цены.
---------
С уважением Олег Поддубный

Re: Скрипт "Для обновления цены в объявлении"

Студент ✭ ✭

Re: Скрипт "Для обновления цены в объявлении"

Восходящие звезды

Для того чтоб скрипт работал корректно нужно прописать правильные параметры.
Так Вам нужно в следующих параметрах внести другие значения:

var PRICE_TEXT_BEGIN = '<span class="spanUAH sum_int">';
var PRICE_TEXT_END = '</span>';

 

Откуда взято эти значения - У Вас на сайте цена на товар указана внутри этих тегов и это выглядеть следующим образом:
<span class="spanUAH sum_int">2903.00</span>

 

Исходя из этого, для первого параметра мы берем все до цены - "<span class="spanUAH sum_int">" , а для второго параметра все после цены - "</span>"

---------
С уважением Олег Поддубный

Re: Скрипт "Для обновления цены в объявлении"

Студент ✭ ✭
Я так и дела, вот: http://prntscr.com/advwui

Но при выполнении скрипта вот такие ошибки http://prntscr.com/advwfo

Спасибо)))
Лучший ответ.
Решение
Утвердил автор темы Katya P
марта 2016

Re: Скрипт "Для обновления цены в объявлении"

Восходящие звезды

У Вас там немного лишнего текста. Уберите из настройки то, что зачеркнуто в скриншоте:

 

3f8bf-clip-78kb.png

---------
С уважением Олег Поддубный

Re: Скрипт "Для обновления цены в объявлении"

Студент ✭ ✭
Большое Спасибо! Все работает!

Re: Скрипт "Для обновления цены в объявлении"

Студент ✭
а если товаров в кампании больше 2000 выдает: Exceeded maximum execution time (Время ожидания истекло) что подскажете можно сделать или есть решение готовое?

Re: Скрипт "Для обновления цены в объявлении"

Восходящие звезды
Андрей, добрый день!

Тогда разбейте выполнение на 2а раза. Т.Е. скопируйте скрипт и вставьте его еще раз при этом, для первой части объявлений укажите леейбл "Тест1" а для второй "Тест2" и запускайте оба скрипта один за другим. Попробуйте. Должно сработать.
---------
С уважением Олег Поддубный

Re: Скрипт "Для обновления цены в объявлении"

Студент ✭
Спасибо, так и подумал... Думал есть проще решение... Ато сумарно 150К товаров где-то(