Last active
February 11, 2017 11:53
-
-
Save VitUrzh/b0d744ecffa67e539ba0a7f1fe2a1f86 to your computer and use it in GitHub Desktop.
Удержание позиции с ограничением ставки.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //Чтобы скрипт знал с какими компаниями работать, для них нужно добавить ярлык с именем 'scriptCtrl' | |
| //Ярлык с именем "maxCPC15" укажет максимальное значение ставки. В данном случае ставка равна 15 | |
| //ярлык targetPosition2.4 указывает, что надо удерживать среднюю позиция 2.4 | |
| // Допустимое отклонение для средней позиции. Т.е. если допустимое отклонение = 0.1 а целевая позиция = 2, то скрипт не затронет ключи с позицией 1.9 и 2.1. | |
| var TOLERANCE = 0.2; | |
| // Множитель для изменения ставок. Т.е. если он равно 1.05 то ставки опустятся или поднимутся на 5%. | |
| var BID_ADJUSTMENT_COEFFICIENT = 1.02; | |
| //не изменять ставку, если за последние дни не было более IMPRESSIONS показов | |
| var IMPRESSIONS = 5; | |
| //Откуда брать максимальную цену | |
| //1 - цена по умолчанию, задается ниже | |
| //2 - цена из ярлыка | |
| //3 - цена из группы | |
| var cpcPlace = 2; | |
| //максимально возможная ставка по умолчанию в валюте аккаунта | |
| var maxCPC = 15.00; | |
| function main() { | |
| var campaignsWithPosition = AdWordsApp.campaigns().withCondition("LabelNames CONTAINS_ANY ['scriptCtrl']").get(); | |
| while (campaignsWithPosition.hasNext()) { | |
| var campaign = campaignsWithPosition.next(); | |
| if(campaign.isEnabled()){ | |
| var targetPositionLabel = campaign.labels().withCondition("LabelName STARTS_WITH_IGNORE_CASE 'targetPosition'").get().next().getName(); | |
| var targetPosition = parseFloat(targetPositionLabel.replace(/[^\d.-]/g, '')); | |
| if(cpcPlace == 2){ | |
| var maxCpcLabel = campaign.labels().withCondition("LabelName STARTS_WITH_IGNORE_CASE 'maxCPC'").get().next().getName(); | |
| var maxCPC = parseFloat(maxCpcLabel.replace(/[^\d.-]/g, '')); | |
| } | |
| Logger.log(campaign.getName() + ' - target posinion: ' + targetPosition); | |
| raiseKeywordBids(campaign, targetPosition, maxCPC); | |
| lowerKeywordBids(campaign, targetPosition); | |
| } | |
| } | |
| } | |
| function raiseKeywordBids(campaign, targetPosition, maxCPC) { | |
| var keywordsToRaise = campaign.keywords() | |
| .withCondition("Status = ENABLED") | |
| .withCondition("AdGroupStatus = ENABLED") | |
| .withCondition("AveragePosition > " + (targetPosition + TOLERANCE)) | |
| .withCondition("Impressions > " + IMPRESSIONS) | |
| //.withCondition("Ctr > 0.01") //Note that Ctr is returned in 0..1 range, so 5% Ctr is represented as 0.05. | |
| .orderBy("AveragePosition ASC") | |
| .forDateRange("LAST_7_DAYS") | |
| .get(); | |
| while (keywordsToRaise.hasNext()) { | |
| var keyword = keywordsToRaise.next(); | |
| if(cpcPlace == 3){ | |
| maxCPC = parseFloat(keyword.getAdGroup().bidding().getCpc()); | |
| } | |
| var NewCost = keyword.getMaxCpc() * BID_ADJUSTMENT_COEFFICIENT; | |
| if (NewCost > maxCPC){ | |
| NewCost = maxCPC; | |
| } | |
| keyword.setMaxCpc(NewCost); | |
| } | |
| } | |
| function lowerKeywordBids(campaign, targetPosition) { | |
| var keywordsToLower = campaign.keywords() | |
| //.withCondition("Ctr > 0.01") | |
| .withCondition("AveragePosition < " + (targetPosition - TOLERANCE)) | |
| .withCondition("Status = ENABLED") | |
| .withCondition("AdGroupStatus = ENABLED") | |
| .withCondition("Impressions > " + IMPRESSIONS) | |
| .orderBy("AveragePosition DESC") | |
| .forDateRange("LAST_7_DAYS") | |
| .get(); | |
| while (keywordsToLower.hasNext()) { | |
| var keyword = keywordsToLower.next(); | |
| keyword.setMaxCpc(keyword.getMaxCpc() / BID_ADJUSTMENT_COEFFICIENT); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment