{"id":7299,"title":"\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 vc.ru: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u0432\u044b\u043d\u043e\u0441\u0438\u043c\u043e\u0435 hr-\u043a\u043b\u0438\u0448\u0435","url":"\/redirect?component=advertising&id=7299&url=https:\/\/vc.ru\/special\/vacancy&placeBit=1&hash=fe5f20397da228f9ae42ee87503a61e3a31884b3954f080b0a1e6dbbf239fec6","isPaidAndBannersEnabled":false}

ТОП 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@example.com'];   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-специалиста.

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

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

{ "author_name": "Ярослав Кишко", "author_type": "self", "tags": [], "comments": 1, "likes": 0, "favorites": 33, "is_advertisement": false, "subsite_label": "marketing", "id": 76315, "is_wide": true, "is_ugc": true, "date": "Mon, 22 Jul 2019 16:32:20 +0300", "is_special": false }
0
1 комментарий
Популярные
По порядку

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

0
Читать все 1 комментарий
Может ли Тинькофф распоряжаться вашими ценными бумагами

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

Будущее наступит во вторник на OneRetailConf
Кейс: Продвижение сети магазинов одежды через аудиорекламу

Отметив трехлетнее сотрудничество с сетью бутиков женской одежды представленных в Москве, Санкт-Петербурге, Ростове-на-Дону и наличием собственного интернет-магазина, параллельно с основными каналами продвижения, мы решили протестировать аудиорекламу.

Биржа NYSE готовится к приостановке торгов

На этой неделе, 13 октября 2021 года, NYSE предложила внести поправки в свои собственные правила, добавив "Правило 7.13 – Приостановление торговых операций".

В МВД и Минтрансе разработали ПДД для электросамокатов и других средств индивидуальной мобильности Статьи редакции

Россияне смогут ездить на скорости до 25 км/ч при весе устройств не более 35 килограммов.

Надуть надувателей: блогеры разоблачают телефонных мошенников, чтобы в мире стало «на одну обманутую бабушку меньше» Статьи редакции

Заявлений о мошенничестве становится всё больше, но полиция не всегда на них реагирует. Чтобы предостеречь других и развлечься, блогеры обзванивают злоумышленников, взламывают их компьютеры и рассекречивают имена. Как они это делают и почему им не доверяют — в пересказе The Guardian.

Окумура звонит мошенникам в роли Ким Кардашьян
Объявлены победители Finlanding
Финансовые династии капитализма

Пришла посылка с новыми книгами:

«Российский рынок акций был и остаётся одним из самых привлекательных в мире»

Виталий Исаков, директор по инвестициям УК «Открытие» («Открытие Инвестиции»).

Дефицит цифровых кадров в России и их подготовка

Весь мир переходит в цифровую среду. Пока в ежегодном глобальном рейтинге конкурентоспособности Россия занимает 43-е место, но задерживаться на нем не намерена. Для этого правительство запустило программу «Цифровая экономика РФ», которая будет поддерживать цифровую экономику в стране и подготовку необходимых кадров.

«Альфа-банк» не начислил корректно кешбэк и общие впечатления

Уже 2 недели ищу время на данный пост, но каждый раз банк чувствует и мешает это сделать – то в приложение не пускает, то в личный кабинет)))

null