Možná si vzpomínáte, že Olena na PPC barbecue zmiňovala jeden ze svých skriptů, který ve Webnode používají. Jedná se o super vychytávku, oštítkuje totiž kampaně s informací o tom, zda byste měli snížit nebo zvýšit bidy. Teď se rozhodli, že ho s námi nasdílí!
Jak to funguje?
- Bere data ze Google spreadsheetu, kde uvádíte název kampaní a jejich cílová CPA
- Skript zkontroluje průměrná CPA za posledních 7 dní a srovná s cílem
- Jestliže se hodnoty liší o +/- 5%, kampaň dostane štítek „Close to %goal%“, pokud je to o více, pak si vyslouží oštítkování „Grow till %goal%“/ „Lower till %goal%“
Pozor, Olena přidává také pár upozornění:
- Číselné hodnoty musí být v tabulce v anglickém formátu, tedy s tečkami
- Log skriptu může ukázat: „311 changes, 25 errors“. To je prý v pohodě, stává se to pokud máte stejné cíle pro více kampaní (label už existuje a skript ho nemůže znovu vytvořit). Zprávu můžete vesele ignorovat
- Pro 20 účtů skript běží 1 minutu, takže je to celkem rychlovka. Rychlost by se dala ještě zoptimalizovat, ale Olena je zatím s výkonem spokojená.
// non changeable things
var SPREADSHEET_URL = "PASTE_HERE_LINK_TO_YOUR_EXCEL_FILE_IN_GOOGLE_DOCS";
var TIMEFRAME = "LAST_7_DAYS"; // because i want to compare with data for last 7 days
var DATA_RANGE = 'A:B'; // first 2 columns in the excel file
var SIG_FIGS = 100; // necessary for rounding cpa to 2 decimals
function main() {
// get my file, get data specified in first 2 columns and let's say 1st column is campaign name then provide me value in 2nd (cuz there's campaign's cpa goal)
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var allSheets = spreadsheet.getSheets();
var allData = [];
for(var i in allSheets) {
var sheet = allSheets[i];
var data = sheet.getRange(DATA_RANGE).getValues();
}
function getGoalCPA(data, Campaign) {
for (var i = 0; i < data.length; i++) {
var row = data[i];
if(Campaign == row[0]) return row[1];
}
}
// since we're on MCC, commands for getting campaigns' name starting from MCC level
var accountIt = MccApp.accounts()
.withCondition("LabelNames CONTAINS 'New accounts'")
.get();
var mccAccount = AdWordsApp.currentAccount();
while (accountIt.hasNext()) {
var account = accountIt.next();
MccApp.select(account)
var CampIt = AdWordsApp.campaigns().withCondition("Status = ENABLED").get();
// when running script each time I need this to delete previous labels
function remove_previous_labels() {
var accountIt = MccApp.accounts()
.get();
while (accountIt.hasNext()) {
var account = accountIt.next();
MccApp.select(account)
var CampIt = AdWordsApp.campaigns().withCondition("Status = ENABLED").get();
while(CampIt.hasNext()) {
var Camp = CampIt.next();
var campaignName = Camp.getName();
var labelIterator = AdWordsApp.labels()
.withCondition("Name CONTAINS 'Grow'")
.get();
if (labelIterator.hasNext()) {
label = labelIterator.next();
label.remove();
}
var labelIterator2 = AdWordsApp.labels()
.withCondition("Name CONTAINS 'Close'")
.get();
if (labelIterator2.hasNext()) {
label2 = labelIterator2.next();
label2.remove();
}
var labelIterator3 = AdWordsApp.labels()
.withCondition("Name CONTAINS 'Lower'")
.get();
if (labelIterator3.hasNext()) {
label3 = labelIterator3.next();
label3.remove();
}
}
}
}
while(CampIt.hasNext()) {
var Camp = CampIt.next();
var campaignName = Camp.getName();
// define current cpa we have in last 7 days; if there're no conversions take a value of cost
if (Camp.getStatsFor(TIMEFRAME).getConvertedClicks() > 0) {
var RealCPA = Camp.getStatsFor(TIMEFRAME).getCost() / Camp.getStatsFor(TIMEFRAME).getConvertedClicks();
}
else {
var RealCPA = Camp.getStatsFor(TIMEFRAME).getCost();
}
// match my campaigns in the account with their info from the file
var GoalCPA = getGoalCPA(data, campaignName);
// make labels names
var LowCPA = 'Grow till '+ GoalCPA;
var OkCPA = 'Close to '+ GoalCPA;
var HighCPA = 'Lower till '+ GoalCPA;
// condition of comparing goal and real cpa
if(RealCPA <= GoalCPA / 100 * 94) {
AdWordsApp.createLabel(LowCPA, "", "#4986CC");
Camp.applyLabel(LowCPA);}
if(RealCPA > GoalCPA / 100 * 94 && RealCPA < GoalCPA/100*106) {
AdWordsApp.createLabel(OkCPA, "", "#D3D3D3");
Camp.applyLabel(OkCPA);}
if(RealCPA >= GoalCPA / 100 * 106) {
AdWordsApp.createLabel(HighCPA, "", "#CE2337");
Camp.applyLabel(HighCPA);}
// write me in the log what campaigns get what cpas - goal and real
Logger.log(account.getName() + " : " + Camp + " : " + Math.round(RealCPA * SIG_FIGS) / SIG_FIGS + " -> " + GoalCPA);
}
}
}
Jiří Homola
10.2.2015 at 11:16
Super a jak je spokojená Olena tak je to v pohodě