{"id":14271,"url":"\/distributions\/14271\/click?bit=1&hash=51917511656265921c5b13ff3eb9d4e048e0aaeb67fc3977400bb43652cdbd32","title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430\u0442\u0438\u0432\u043e\u043a \u0438 \u0441\u043f\u0435\u0446\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 vc.ru \u2014 \u043d\u0430\u0439\u0434\u0438\u0441\u044c!","buttonText":"","imageUuid":""}

ТОП 5 скриптов в Google Ads для профессионала

Скрипт – это фрагмент кода на JavaScript, который позволяет вносить изменения в аккаунт Google Ads. Если вы управляете крупными проектами, скрипты помогут сэкономить время при массовом редактировании аккаунта, а также помогут освободить специалиста по контекстной рекламе от некоторых рутинных задач.

1. Скрипт проверки товаров на сайте

Скрипт проверяет наличие товаров на сайте, и в случае их отсутствия приостанавливает объявления. Для отработки скрипта следует создать ярлык на кампанию (кампании), для которых будет отрабатывать данный скрипт, и в настройке скрипта в строчке CAMPAIGN_LABEL = 'НазваниеЯрлыка' указать название собственного ярлыка.

/************************************ * Item Out Of Stock Checker * Version 1.1 * ChangeLog v1.1 - Filtered out deleted Campaigns and AdGroups * Created By: Russ Savage * FreeAdWordsScripts.com ***********************************/ var URL_LEVEL = 'Ad'; // or Keyword var ONLY_ACTIVE = true; // 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 OUT_OF_STOCK_TEXT = 'The Text That Identifies An Out Of Stock Item Goes Here'; function main() {   var alreadyCheckedUrls = {};   var iter = buildSelector().get();   while(iter.hasNext()) {     var entity = iter.next();     var url = cleanUrl(entity.getDestinationUrl());     if(alreadyCheckedUrls[url]) {       if(alreadyCheckedUrls[url] === 'out of stock') {         entity.pause();       } else {         entity.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]);   } } nfunction 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() {   var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();   selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED');   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; }

2. Скрипт чистки площадок КМС

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

Для работы со скриптом следует создать ярлык для медийных кампаний, а также указать этот ярлык в скрипте. В перечисление доменов можно добавить свои, а так же можно исключать доменные зоны, к примеру задать ‘ru’. Еще можно задать за какой период будут обрабатываться площадки. По умолчанию в скрипте установлен период 7 дней.

Возможные периоды:

LAST_7_DAYS

LAST_WEEK

LAST_MONTH

LAST_14_DAYS

LAST_30_DAYS

LAST_BUSINESS_WEEK

THIS_WEEK_SUN_TODAY

THIS_WEEK_MON_TODAY

LAST_WEEK_SUN_SAT

THIS_MONTH

/* * Скрипт создан Алексеем Ярошенко. */ var exclude = ['pdf','gta', 'dota', 'minecraft', 'resheb', 'referat', 'igry', 'igra', 'igri', 'game', 'flash', 'apk', 'android', 'mp3', 'fb2', 'dating', 'goroskop', 'astro', 'film', 'video', 'movie', 'book', 'download', 'torrent', 'kino', 'radio', 'weather', 'pesni', 'chords', 'anekdot', 'zodiak', 'minusovk', 'knig', 'recept', 'recipe', 'spongebob', 'barbie', 'skyrim', 'ferma', 'dom2', 'mafia', 'gadani', 'mario', 'epub', '2048', 'dendy', 'sega', 'zuma', 'aforizm', 'citat', 'pdf', 'simulat', 'mods', 'play', 'spintires', 'spin-tires', 'girl', 'boy' ]; var period = 'LAST_7_DAYS'; 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, Conversions " +         "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['Conversions'] < 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 ['НазваниеЯрлыка']").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');         });     } }

3. Скрипт удержания позиции

Скрипт запускается каждые 7 дней и повышает или понижает ставки для тех ключевых фраз, которые находятся выше или ниже от той позиции, которую мы задали.

Подробнее о настройках скрипта можно узнать на сайте автора.

// Допустимое отклонение для средней позиции. Т.е. если допустимое отклонение = 0.1 а целевая позиция = 2, то скрипт не затронет ключи с позицией 1.9 и 2.1. var TOLERANCE = 0.1; // Множитель для изменения ставок. Т.е. если он равно 1.05, то ставки опустятся или поднимутся на 5%. var BID_ADJUSTMENT_COEFFICIENT = 1.05; function main() {   var campaignsWithPosition = AdWordsApp.campaigns().withCondition("LabelNames CONTAINS_ANY ['positionControl']").get();   while (campaignsWithPosition.hasNext()) {     var campaign = campaignsWithPosition.next();     var targetPositionLabel = campaign.labels().withCondition("LabelName STARTS_WITH_IGNORE_CASE 'targetPosition'").get().next().getName();     var targetPosition = parseFloat(targetPositionLabel.replace(/[^\d.-]/g, ''));     Logger.log(campaign.getName() + ' - target posinion: ' + targetPosition);     raiseKeywordBids(campaign, targetPosition);     lowerKeywordBids(campaign, targetPosition);   } } function raiseKeywordBids(campaign, targetPosition) {   var keywordsToRaise = campaign.keywords()     .withCondition("Status = ENABLED")     .withCondition("AveragePosition > " + (targetPosition + TOLERANCE))     .orderBy("AveragePosition ASC")     .forDateRange("LAST_7_DAYS")     .get();   while (keywordsToRaise.hasNext()) {     var keyword = keywordsToRaise.next();     keyword.setMaxCpc(keyword.getMaxCpc() * BID_ADJUSTMENT_COEFFICIENT);   } } function lowerKeywordBids(campaign, targetPosition) {   var keywordsToLower = campaign.keywords()     .withCondition("Ctr > 0.01")     .withCondition("AveragePosition < " + (targetPosition - TOLERANCE))     .withCondition("Status = ENABLED")     .orderBy("AveragePosition DESC")     .forDateRange("LAST_7_DAYS")     .get();   while (keywordsToLower.hasNext()) {     var keyword = keywordsToLower.next();     keyword.setMaxCpc(keyword.getMaxCpc() / BID_ADJUSTMENT_COEFFICIENT);   } }

4. Перерасход бюджета

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

Данный скрипт проверяет работу абсолютно всех кампаний. В скрипте можно задать в процентном соотношении допустимые рамки превышения бюджета. По умолчанию скрипт останавливает кампанию в том случае, если они на 20% превысили дневной бюджет. Если для вас это много, вы можете изменить параметр allowedOverdeliveryPercentage.

function main() {   var allowedOverdeliveryPercentage = 0.2; // set percentage as decimal, i.e. 20% should be set as 0.2   var labelName = "paused by overdelivery checker script";    AdWordsApp.createLabel(labelName, "automatic label needed to reenable campaigns");     var campaigns = AdWordsApp.campaigns()    .withCondition("Status = ENABLED")    .withCondition("Cost > 0")    .forDateRange("TODAY");   var campaignIterator = campaigns.get();   while (campaignIterator.hasNext()) {     var campaign = campaignIterator.next();     var campaignName = campaign.getName();     var budgetAmount = campaign.getBudget().getAmount();     var costToday = campaign.getStatsFor("TODAY").getCost();     if(costToday > budgetAmount * (1 + allowedOverdeliveryPercentage)) {       Logger.log(campaignName + " has spent " + costToday + " which is more than allowed.");       campaign.applyLabel(labelName);       campaign.pause();     } else {       Logger.log(campaignName + " has spent " + costToday + " and can continue to run.");     }   } }

5. Скрипт проверки битых ссылок

Скрипт проверяет ссылки объявлений на наличие ошибок 404,500. Часто бывает, что клиент проводит работы с сайтом, но не сообщает об этом специалисту по контекстной рекламе. В последствии чего рекламный бюджет тратится, а весь сайт, либо отдельные его страницы, на которые ведёт реклама, в это время не работают.

Всё, что нужно указать, это ваш email, на который прийдёт отчёт с перечнем битых ссылок.

/**************************** * Find Broken Urls In Your Account * Version 1.1 * ChangeLog v1.1 *  - Updated to only see Text Ads * Created By: Russ Savage * FreeAdWordsScripts.com ****************************/ function main() {   var BAD_CODES = [404,500];   var TO = ['ваш[email protected]'];   var SUBJECT = 'Broken Url Report - ' + _getDateString();   var HTTP_OPTIONS = {     muteHttpExceptions:true   };   //Let's look at ads and keywords for urls   var iters = [     //For Ad Level Urls     AdWordsApp.ads()       .withCondition("Status = 'ENABLED'")       .withCondition("AdGroupStatus = 'ENABLED'")       .withCondition("CampaignStatus = 'ENABLED'")       .withCondition("Type = 'TEXT_AD'")       .get(),     //For Keyword Level Urls     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) {         //Let's remove the value track parameters         url = url.replace(/{[0-9a-zA-Z]+}/g,'');       }       if(already_checked[url]) { continue; }       var response_code;       try {         Logger.log("Testing url: "+url);         response_code = UrlFetchApp.fetch(url, HTTP_OPTIONS).getResponseCode();       } catch(e) {         //Something is wrong here, we should know about it.         bad_entities.push({e : entity, code : -1});       }       if(BAD_CODES.indexOf(response_code) >= 0) {         //This entity has an issue.  Save it for later.         bad_entities.push({e : entity, code : response_code});       }       already_checked[url] = true;     }   }   var column_names = ['Type','CampaignName','AdGroupName','Id','Headline/KeywordText','ResponseCode','DestUrl'];   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 = "There are " + bad_entities.length + " urls that are broken. See attachment for details.";     for(var i in TO) {       MailApp.sendEmail(TO[i], SUBJECT, email_body, options);     }   }  } //Formats a row of results separated by SEP function _formatResults(entity,SEP) {   var e = entity.e;   if(typeof(e['getHeadline']) != "undefined") {     //this is an ad entity     return ["Ad",             e.getCampaign().getName(),             e.getAdGroup().getName(),             e.getId(),             e.getHeadline(),             entity.code,             e.getDestinationUrl()            ].join(SEP)+"n";   } else {     // and this is a keyword     return ["Keyword",             e.getCampaign().getName(),             e.getAdGroup().getName(),             e.getId(),             e.getText(),             entity.code,             e.getDestinationUrl()            ].join(SEP)+"n";   } } //Helper function to format todays date function _getDateString() {   return Utilities.formatDate((new Date()), AdWordsApp.currentAccount().getTimeZone(), "yyyy-MM-dd"); }

Выводы

Использование скриптов - это только один из многих способов автоматизировать работу контекстной рекламы. Оставляю ссылку на еще 20 способов автоматизации работы PPC-специалиста.

Если вам не хватило скриптов или не нашлось необходимого, можете найти их тут.

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

0
1 комментарий
Академия ШАГ

Не работает Скрипт чистки площадок КМС.
Создал ярлык, повесил на КМС кампании. Прописал ярлык в скрипте.
В чем может быть проблема?

Ответить
Развернуть ветку
-2 комментариев
Раскрывать всегда