Мы работаем не только в Моcкве, но и в других городах России:

Нужен эффективный контекст? Заказать

Полезные скрипты для Google Adwords

Подписаться
Больше интересностей из блога студии SEMANTICA
Получайте эффективные советы по интернет-рекламе и SEO-оптимизации вашего сайта
ВКонтакте:
Facebook:
Twitter:

код

Рынок контекстной рекламы развивается очень стремительно. Каждый день выходят разные плюшки: начиная с увеличения количества дополнительных ссылок,  заканчивая новым алгоритмом и ранжированием. Что уж говорить об автоматизации, без которой специалисту по контекстной рекламе жить  просто невозможно. Но! Далеко не все могут позволить себе пользоваться сервисами автоматизации (по разным причинам). Поэтому сегодня я расскажу о том, как можно автоматизировать процесс создания и ведения контекстной рекламы без использования сторонних сервисов автоматизации. Сегодня нашим главным помощником будут скрипты Google Adwords.

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

  1. Заходим в adwords.google.com.
  2. Слева в колонке выбираем массовые операции.
  3. Нажимаем "Скрипты":
    a56cd5e559
  4. Нажимаем кнопку "+ Скрипт":
    182ec94329

Перед вами открывается окно для создания скрипта:

79cd045abd

Если вы обладаете знаниями JavaScript , то смело можете самостоятельно написать все, что вам нужно, а для новичков есть готовые решения:

796fc06ebe

 

Прежде чем скрипт начнет выполнять заданные условия, программа запросит авторизацию к вашим рекламным кампания (что логично):

2093ce012c

Не бойтесь, смело нажимайте "Авторизация". Скрипт всегда можно сохранить в черновиках и перед запуском легко проверить с помощью красной кнопки «Просмотр».

9d1f7f228c

Скрипт можно запускать как разового, так и по необходимости. Также можно создать расписание.

0bb81c4cfc

 

 

 

Базовые скрипты для Google Adwords

Не будем перечислять все возможные скрипты. Расскажем только про самые базовые.

Первый базовый скрипт Гугл Адвордс

Все мы знаем, что контекстная реклама это текстовое объявление, которое отвечает на запрос пользователя и  приводит его на сайт с целевой посадочной страницей. Порой ppc специалистам приходится создавать сотни и тысячи объявлений с разными url страниц. Понятно, что никто не проверяет корректность работы целевой страницы ежедневно. Поэтому первый скрипт — "Проверка в объявлениях целевые url на 404 ошибку.

function main() {
   var campIter = AdWordsApp.campaigns().withCondition("Status = ENABLED").get();
   while (campIter.hasNext()) {
      var camp = campIter.next();

      var adIter = camp.ads().withCondition("Status != DISABLED").get();

      while (adIter.hasNext()) {

         var ad = adIter.next();

         Logger.log('Now checking ad #' + ad.getId());

         var destUrl = ad.getDestinationUrl();

         var options = {muteHttpExceptions: true};

         var response = UrlFetchApp.fetch(destUrl, options);
         var responseCode = response.getResponseCode();

         if (responseCode == 404.0) {
            Logger.log(camp.getName());
            Logger.log(ad.getAdGroup().getName());
            Logger.log(destUrl);
            Logger.log(ad.getApprovalStatus());
            Logger.log(response.getResponseCode());
         } else if (responseCode == 200.0) {
            Logger.log('Ad OK -- 200 HTTP Response Code.');

         }
      }
   }
}

Битые ссылки можно проверить и на уровне центра клиентов.

 

Второй скрипт Google Adwords: настройка

Второй полезный и простой скрипт «Автоматическая чистка неэффективных площадок в КМС».

Google обладает огромной базой сайтов-партнеров. Это одновременно как плюс, так и большой минус, потому что 60% приносят мусорный трафик даже при правильном таргетировании, за который приходится платить (если во время не отсечь). В основном, это площадки, связанные с разнообразными играми.

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

var period = 'LAST_MONTH';
function main() {
    var periodString = '';
    if(period) {
        periodString = "DURING " + period;
        Logger.log(periodString);
        } else {
        Logger.log('DURING ALL TIME');
    }
    var report = AdWordsApp.report("SELECT Domain, Clicks, ConvertedClicks " +
    "FROM AUTOMATIC_PLACEMENTS_PERFORMANCE_REPORT " +
    periodString);
    var rows = report.rows();
    var excludePlacementArray = [];
    while (rows.hasNext()) {
        var row = rows.next();
        var placement = row['Domain'];
        if (containsAny(placement.toString(), exclude) && (row['ConvertedClicks'] < 1)) {
            excludePlacementArray[excludePlacementArray.length] = placement.toString();
        }
    }
    addNegativeKeywordToCampaign(excludePlacementArray);
}
function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
        var substring = substrings[i];
        if ((str.indexOf(substring) != - 1) && (str.indexOf('mobileapp::') == - 1)) {
            return substring;
        }
    }
    return null;
}
function addNegativeKeywordToCampaign(negativePlacements) {
    var campaignIterator = AdWordsApp.campaigns().withCondition("LabelNames CONTAINS_ANY ['PlacementCleaner']").get();
    while (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next();
        negativePlacements.forEach(function(entry) {
            excludePlacement = campaign.display().newPlacementBuilder();
            excludePlacement.withUrl(entry.toString()).exclude();
            Logger.log(entry.toString() + ' - Excluded');
        });
    }
}

Google Аdwords script — "Анти-слив"

Следующий скрипт, который поможет избежать слива бюджета «Остановка кампаний, когда сайт не работает».

 

</pre>
function main() {
var BAD_CODES = [500];
var TO = ['адрес вашей почтыy@gmail.com'];
var SUBJECT = 'Отчет по некорректным url - ' + _getDateString();
var HTTP_OPTIONS = {
muteHttpExceptions:true
};
var iters = [
// Для url уровня объявлений
AdWordsApp.ads()
.withCondition("Status = 'ENABLED'")
.withCondition("AdGroupStatus = 'ENABLED'")
.withCondition("CampaignStatus = 'ENABLED'")
.withCondition("Type = 'TEXT_AD'")
.get(),
//Для url уровня ключевиков
// AdWordsApp.keywords()
//   .withCondition("Status = 'ENABLED'")
//   .withCondition("DestinationUrl != ''")
//   .withCondition("AdGroupStatus = 'ENABLED'")
//   .withCondition("CampaignStatus = 'ENABLED'")
//   .get()
];
var already_checked = {};
var bad_entities = [];
for(var x in iters) {
var iter = iters[x];
while(iter.hasNext()) {
var entity = iter.next();
if(entity.getDestinationUrl() == null) { continue; }
var url = entity.getDestinationUrl();
if(url.indexOf('{') >= 0) {
// Удаляем параметры отслеживания
url = url.replace(/{[0-9a-zA-Z]+}/g,'');
}
if(already_checked[url]) { continue; }
var response_code;
try {
Logger.log("Тестовый url: "+url);
response_code = UrlFetchApp.fetch(url, HTTP_OPTIONS).getResponseCode();
} catch(e) {
// Что-то пошло не так, нужно сообщить нам об этом
bad_entities.push({e : entity, code : -1});
Logger.log('Ошибка');
entity.pause();
}
if(BAD_CODES.indexOf(response_code) >= 0) {
// Этот элемент с ошибкой, сохраним его.
bad_entities.push({e : entity, code : response_code});
Logger.log('Некорректный url: ' + url);
entity.pause();
}
already_checked[url] = true;
}
}
var column_names = ['Тип','Кампания','Группа','Id','Заголовок/Ключевое слово','Ответ сервера','Адрес(Url)'];
var attachment = column_names.join(",")+"n";
for(var i in bad_entities) {
attachment += _formatResults(bad_entities[i],",");
}
if(bad_entities.length > 0) {
var options = { attachments: [Utilities.newBlob(attachment, 'text/csv', 'bad_urls_'+_getDateString()+'.csv')] };
var email_body = "В наличии " + bad_entities.length + " некорректных url. Подробности в приложении.";
for(var i in TO) {
MailApp.sendEmail(TO[i], SUBJECT, email_body, options);
}
}
}
//Форматирование рядов с результатами, разделяемое SEP
function _formatResults(entity,SEP) {
var e = entity.e;
if(typeof(e['getHeadline']) != "undefined") {
// Элемент объявления
return ["Ad",
e.getCampaign().getName(),
e.getAdGroup().getName(),
e.getId(),
e.getHeadline(),
entity.code,
e.getDestinationUrl()
].join(SEP)+"n";
} else {
// и ключевика
return ["Keyword",
e.getCampaign().getName(),
e.getAdGroup().getName(),
e.getId(),
e.getText(),
entity.code,
e.getDestinationUrl()
].join(SEP)+"n";
}
}
// Вспомогательная функция. Форматирование сегодняшней даты.
function _getDateString() {
return Utilities.formatDate((new Date()), AdWordsApp.currentAccount().getTimeZone(), "yyyy-MM-dd");
<pre>

Если в данный скрипт добавить другие коды ответов сервера, то и их можно будет отслеживать. Таким образом можно объединить в один скрипт битые ссылки и не работающий сайт.

 

Кросс-минусовка в Adwords

Еще один скрипт, которым хотелось бы поделиться это «кросс-минусовка ключей».

Всем специалистам по контекстной рекламе известно, что кросс-минусовка также важна как и минус слова. Иначе могут получится довольно печальные ситуации, когда из-за отсутствия кросс-минусовки показывается объявление, которое нерелевантно запросу. К сожалению, в Google Adwords нет инструмента, который бы позволял это делать. Не беда, если у вас всего 20 ключей и их можно руками переминусовать. А если тысячи...

//Названия кампании, в которой необходима кросс-минусовка
var CampaignName= 'Тут Название Вашей кампании';
//Добавляем в массив только новые слова
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(adGroupName,key) {
    var adGroupIterator = AdWordsApp.adGroups()
    .withCondition('Name ="'+adGroupName+'"')
    .get();
    if (adGroupIterator.hasNext()) {
        var adGroup = adGroupIterator.next();
        for (i=0;i<key.length;i++){
            adGroup.createNegativeKeyword(key[i].toString());
        }
    }
}
function main() {
    var keyArray=[];
    var adGroupIterator = AdWordsApp.adGroups()
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("CampaignName IN ['" + CampaignName + "']")
    .get();
    Logger.log ('Всего найдено активных групп: ' + adGroupIterator.totalNumEntities());
    while (adGroupIterator.hasNext()) {
        var adGroup = adGroupIterator.next();
        var adGroupName=adGroup.getName();
        var keywordIterator = adGroup.keywords().withCondition("KeywordMatchType = BROAD").get();
        while (keywordIterator.hasNext() ) {
            var keyword = keywordIterator.next();
            keytext= keyword.getText();
            keyArray.push({'adGroup':adGroupName,'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++;
    }
}</pre>
<pre>

 

 

 

Cкрипт Эдвордс Гугл для акций и распродаж

Календарь обратного отсчета для распродаж.

И таймер обратного отчета до завершения продажи.

 

Разница этих скриптов в том, что, используя календарь, вы можете сделать в одной кампании для разных продуктов/ услуг разные аукционные объявления.


Полезности

Это лишь малая часть разнообразных скриптов, которые упрощают жизнь каждому специалисту по контекстной рекламе.

 

Полезные ссылки:

https://developers.google.com/adwords/scripts/docs/solutions/

http://www.freeadwordsscripts.com/ 

https://docs.google.com/spreadsheets/d/1vFCcgSY4q0cxAdXa1SnbLefIrWop9-_qVz8oh7IZHdQ/edit#gid=0

 

Желаем вам удачи и не усложняйте себе жизнь сами  =)

Задать вопрос по статье
Подпишись на нашу группу в VK и получай экспертные статьи прямо в ленту!
  • Георгий

    Здравствуйте благодарю за подборку скриптов, скажите скрипт кросс-минусовка работает для «одна группа один ключ»?


Мы работаем не только в Моcкве, но и в других городах России: