Skip to content

Instantly share code, notes, and snippets.

@VitUrzh
Last active February 11, 2017 11:53
Show Gist options
  • Select an option

  • Save VitUrzh/b0d744ecffa67e539ba0a7f1fe2a1f86 to your computer and use it in GitHub Desktop.

Select an option

Save VitUrzh/b0d744ecffa67e539ba0a7f1fe2a1f86 to your computer and use it in GitHub Desktop.
Удержание позиции с ограничением ставки.
//Чтобы скрипт знал с какими компаниями работать, для них нужно добавить ярлык с именем '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