Скрипт – это фрагмент кода на 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 дней.
/*
* Скрипт создан Алексеем Ярошенко.
*/
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");
}
Если вам не хватило скриптов или не нашлось необходимого, можете найти их тут.
Автоматизация процессов, которые повторяются регулярно и не требуют предельной концентрации, помогают освобождать по несколько часов рабочего времени, которые можно использовать на анализ эффективности рекламных кампаний, а также создание и тестирование новых нароботок.
Не работает Скрипт чистки площадок КМС.
Создал ярлык, повесил на КМС кампании. Прописал ярлык в скрипте.
В чем может быть проблема?