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ě