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

Скрипт кросс-минусовки ключей

Ведущий участник

Всем доброго дня.
Выкладываю для бета-теста скрипт кросс-минусовки ключей в кампании.
Скрипт не учитывает словоформы, поэтому добавляет их как есть. Обрабатывает только активные группы и ключи в широком соответствии или с модификатором (если точнее, то знак модификатора игнорируется)
Тест проводил на новых импортированных из директа кампаниях, где каждый ключ был в своей группе. Там работает. Если в группе много разных не связанных ключей, то подозреваю, могут быть ошибки, для чего и выкладываю для текста.
При нахождении ошибок, прошу выкладывать подробную информацию: группы с ключами, которые неправильно заминусовались и с чем пересекаются.
Если новые минус слова заблокировали показ Ваших ключей с фразовым или точным соответствием в группах, то просто удалите не нужные исключения, благо это можно сделать в интерфейсе в два клика, либо перенесите ключи в отдельную группу.
Использование скрипта на свой страх и и риск. Делайте предварительно бекапы.

 

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

Утвержденные решения
Лучший ответ.
Решение
Утвердил автор темы Андрей Москалец
октября 2015

Re: Скрипт кросс-минусовки ключей

Ведущий участник
//Ярлык кампании(ий), в которой необходима кросс-минусовка
//можно использовать несколько через запятую, например '["cross", "hot", "cool"]'
var CampaignLabel= '["cross"]'; 


function main() {
  var keyArray=[];
  var campaignIterator = AdWordsApp
     .campaigns()
     .withCondition("LabelNames CONTAINS_ANY "+CampaignLabel)
     .withCondition("Status = ENABLED")
     .get();
  Logger.log('Всего найдено активных кампаний: ' + campaignIterator.totalNumEntities());
  
 while (campaignIterator.hasNext()) {
    var campaign = campaignIterator.next();
   Logger.log('Кампания: '+campaign.getName());
   
    var adGroupIterator = campaign.adGroups()
   .withCondition("AdGroupStatus = ENABLED")
   .get();
   Logger.log('Всего найдено активных групп: ' + adGroupIterator.totalNumEntities());
   
    while (adGroupIterator.hasNext()) {
      var adGroup = adGroupIterator.next();
      var adGroupID=adGroup.getId();
      var keywordIterator = adGroup.keywords().withCondition("KeywordMatchType = BROAD").get();
    
      while (keywordIterator.hasNext() ) {
        var keyword = keywordIterator.next();
        keytext= keyword.getText();
        keyArray.push({'adGroup':adGroupID,'key': keytext.replace( /\+/g, '' ).split(' ') });
    }
};
  }


  
//обработка ключей     
for (j=0; j< keyArray.length; j++){
var exkey=[];
var resSravn=null;
for (i=0; i< keyArray.length; i++){
	if (i!==j){
		resSravn=differ(keyArray[i]['key'],keyArray[j]['key']);
		if (resSravn!==null){
			addUnical(resSravn,exkey);
			(keyArray[j]['exkey'])=exkey;
			}
	}
	}
}

//добавляем исключения в группы
var i = 0;
while (i < keyArray.length) {
  if (keyArray[i]['exkey']!==undefined) {
    
  addExKeyword(keyArray[i]['adGroup'],keyArray[i]['exkey']);
  }
  i++;
}      
        
 
//вывод лога
var i = 0;
while (i < keyArray.length) {
  Logger.log("Группа:"+keyArray[i]['adGroup']+"; Ключ:"+keyArray[i]['key']+"; Исключения:"+keyArray[i]['exkey']);
  i++;
}
}




//Добавляем в массив только новые слова
//Первый параметр - массив что добавляем, Второй куда
function addUnical(a1, a2) {
a1.forEach (
	function(item, i, arr){
		if (a2.indexOf(item)===-1){
		a2.push(item);
		} 
	})
}

//возвращает массив слов, которые не совпали
function differ(a, b) {
var alen = a.length;
var arr = [];
var samekey=0;
var i = 0;
while (i < alen) {
  var key = a[i++];
  if (b.indexOf(key) === -1) {
    arr.push(key);
  }
  else {samekey++}
}
if (samekey===b.length){
return arr;
}
return null;
}

//Добавляет исключения в заданную группу
function addExKeyword(adGroupId,key) {
  var adGroupIterator = AdWordsApp.adGroups()
      .withCondition('Id ="'+adGroupId+'"')
      .get();
  if (adGroupIterator.hasNext()) {
    var adGroup = adGroupIterator.next();
    for (i=0;i<key.length;i++){
    adGroup.createNegativeKeyword(key[i].toString());
    }
  }
}

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


Все ответы
Лучший ответ.
Решение
Утвердил автор темы Андрей Москалец
октября 2015

Re: Скрипт кросс-минусовки ключей

Ведущий участник
//Ярлык кампании(ий), в которой необходима кросс-минусовка
//можно использовать несколько через запятую, например '["cross", "hot", "cool"]'
var CampaignLabel= '["cross"]'; 


function main() {
  var keyArray=[];
  var campaignIterator = AdWordsApp
     .campaigns()
     .withCondition("LabelNames CONTAINS_ANY "+CampaignLabel)
     .withCondition("Status = ENABLED")
     .get();
  Logger.log('Всего найдено активных кампаний: ' + campaignIterator.totalNumEntities());
  
 while (campaignIterator.hasNext()) {
    var campaign = campaignIterator.next();
   Logger.log('Кампания: '+campaign.getName());
   
    var adGroupIterator = campaign.adGroups()
   .withCondition("AdGroupStatus = ENABLED")
   .get();
   Logger.log('Всего найдено активных групп: ' + adGroupIterator.totalNumEntities());
   
    while (adGroupIterator.hasNext()) {
      var adGroup = adGroupIterator.next();
      var adGroupID=adGroup.getId();
      var keywordIterator = adGroup.keywords().withCondition("KeywordMatchType = BROAD").get();
    
      while (keywordIterator.hasNext() ) {
        var keyword = keywordIterator.next();
        keytext= keyword.getText();
        keyArray.push({'adGroup':adGroupID,'key': keytext.replace( /\+/g, '' ).split(' ') });
    }
};
  }


  
//обработка ключей     
for (j=0; j< keyArray.length; j++){
var exkey=[];
var resSravn=null;
for (i=0; i< keyArray.length; i++){
	if (i!==j){
		resSravn=differ(keyArray[i]['key'],keyArray[j]['key']);
		if (resSravn!==null){
			addUnical(resSravn,exkey);
			(keyArray[j]['exkey'])=exkey;
			}
	}
	}
}

//добавляем исключения в группы
var i = 0;
while (i < keyArray.length) {
  if (keyArray[i]['exkey']!==undefined) {
    
  addExKeyword(keyArray[i]['adGroup'],keyArray[i]['exkey']);
  }
  i++;
}      
        
 
//вывод лога
var i = 0;
while (i < keyArray.length) {
  Logger.log("Группа:"+keyArray[i]['adGroup']+"; Ключ:"+keyArray[i]['key']+"; Исключения:"+keyArray[i]['exkey']);
  i++;
}
}




//Добавляем в массив только новые слова
//Первый параметр - массив что добавляем, Второй куда
function addUnical(a1, a2) {
a1.forEach (
	function(item, i, arr){
		if (a2.indexOf(item)===-1){
		a2.push(item);
		} 
	})
}

//возвращает массив слов, которые не совпали
function differ(a, b) {
var alen = a.length;
var arr = [];
var samekey=0;
var i = 0;
while (i < alen) {
  var key = a[i++];
  if (b.indexOf(key) === -1) {
    arr.push(key);
  }
  else {samekey++}
}
if (samekey===b.length){
return arr;
}
return null;
}

//Добавляет исключения в заданную группу
function addExKeyword(adGroupId,key) {
  var adGroupIterator = AdWordsApp.adGroups()
      .withCondition('Id ="'+adGroupId+'"')
      .get();
  if (adGroupIterator.hasNext()) {
    var adGroup = adGroupIterator.next();
    for (i=0;i<key.length;i++){
    adGroup.createNegativeKeyword(key[i].toString());
    }
  }
}

Re: Скрипт кросс-минусовки ключей

Восходящие звезды
Ок, Андрей! Попробую протестировать и отпишусь Вам)

Re: Скрипт кросс-минусовки ключей

Студент ✭

Re: Скрипт кросс-минусовки ключей

Ведущий участник
Добрый день, Александр
Спасибо что тестируете. Подскажите, данная кампании активна, но в ней есть удаленные группы? Из картинки не понятно, какой объект удален. Или там был такой ключ, но статус у него удален?

Re: Скрипт кросс-минусовки ключей

Студент ✭
Андрей, было бы хорошо игнорировать предлоги http://img.netpeak.ua/fenix/144663135726_kiss_24kb.png

Re: Скрипт кросс-минусовки ключей

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

Re: Скрипт кросс-минусовки ключей

Студент ✭
Если в группе несколько ключей, то между собой они тоже переминусовываются. Поэтому применимо только для логики 1 ключ - 1 группа

Re: Скрипт кросс-минусовки ключей

Магистр ✭
спасибо за скрипт, будем тестить..интересно насколько сложно сделать, чтоб скрипт еще и склонял минус-слова? я вот знаю что эту технологию: aot.ru используют некоторые сервисы для работы с морфологией...может это как-то пригодится...

Re: Скрипт кросс-минусовки ключей

Ведущий участник

Я пока вижу только один способ такой реализации - запустить на своем сайте скрипт морфологизатора и передавать слова для нахождения корня и склонения из скрипта AdWords, а потом полученные слова передавать обратно. В самом скрипте это выполнить не получиться. У яндекса, кстати есть склонялка: https://export.yandex.ru/inflect.xml?name=%D0%BE%D0%BA%D0%BD%D0%BE
Но только она не находит корень слова, т.е. если передать не "окно", а "окна", то уже выдаст только исходный вариант