Při optimalizaci Adwords účtu je velmi důležité dlouhodobě sledovat trend vývoje PNO a vůbec ziskovosti celého účtu na různých úrovních.
PNO metrika reprezentuje procentuální náklady na obrat eshopu. Pokud máte správně fungující měřící kód pro měření hodnoty objednávky, dá se metrika PNO přímo porovnat s průměrnou marží Vašeho obchodu. Pokud tedy máte průměrnou marži 20 % a PNO 10 %, v podstatě z každé objednávky vyděláte 10 %. Skript Vám tedy dosadí sloupec s PNO a ziskem/ ztrátou účtu.
Jak skript funguje
Jakmile skript nasadíte do svého Adwords účtu (nejedná se záměrně o MCC skript, protože každý účet má individuální nastavení cílové PNO a marže internetového obchodu), po spuštění vytvoří několik listů, z nichž první se jmenuje “Nastavení”.
Co zde můžete nastavit:
- Jakou marži má Adwords skript brát v úvahu při výpočtů ziskovosti účtu.
- Při jaké denní ztrátě účtu chcete dostat upozornění na email.
- Na jaký email budou daná upozornění chodit.
- Jaký bude předmět emailu, což slouží pro rozpoznání účtu. Adwords neumožňuje zjistit název účtu pro lepší identifikaci a číslo Adwords účtu se nezdá jako příliš uživatelsky přívětivé.
- Poslední možností je, kolik dní zpátky chcete stahovat historické statistiky pro přehled návratnosti kampaní a reklamních sestav.
Jistě se ptáte, proč je nastavení uděláno v prostředí Google sheetu a ne přímo ve skriptu. Ze zkušenosti vím, že PPCčkaři nejsou ve většině případů programátoři a je pro ně daleko snažší změnit něco v předem dané buňce, než hledat ve skriptu tu část, která o výpočtu rozhoduje. Takto si každý může upravit zásadní prvky skriptu sám bez znalosti Javascriptu. Jakmile volbu změníte tak při dalším běhu skriptu již bude počítat s novými údaji.
Představení listů a jednotlivých reportů ve skriptu
Skript samozřejmě kromě nastavení obsahuje další listy, které už Vám opravdu pomohou při optimalizaci Vaší kampaně.
List “Denní výkon účtu”
Na listu “Denní výkon účtu” vidíte svůj účet a všechny zásadní statistiky za posledních 60 dnů. Kromě standardních statistik, které naleznete v Adwords ve skriptu, se dopočítává každý den pomocí vzorečku zisk/ztráta celého účtu a PNO celého účtu.
Navíc v případě PNO, které je vyšší než Vaše marže, skript automaticky daný den označí červeně a v případě kladného dne buňka zezelená.
Kromě klasického přehledu obsahuje denní report 2 věci, které se opravdu hodí:
- V případě, že účet zaznamená za předešlý den ztrátu, kterou máte nastavenou na listu “Nastavení”, pošle skript na zvolený email zprávu o ztrátě účtu.
- V případě, že denní náklady účtu jsou 0, což se většinou stává, když na účtu dojdou peníze, pošle Vám skript email také s upozorněním na vyčerpané peníze na účtu. (Pokud jste z nějakého důvodu kampaně na měsíc pozastavili a nechcete dostávat notifikace každý den, stačí pozastavit automatické spouštění skriptu, případně z nastavení smazat email. Skript v tomto případě sice bude psát chybu, ale nebudou Vám chodit informativní emaily).
List “Týdenní výkon účtu”
Protože denní přehled pro různé trendy není pokaždé úplně dobrý, např. víkendy jsou horší, pondělí zase lepší, kdo má vědět, zda se celkově účet zlepšuje? V takovém případě je tedy dobré trendy sledovat v týdenním přehledu, který zobrazuje statistiky celého účtu za posledních 20 týdnů. Budete tak mít přehled o zisku účtu, o vývoji ceny za proklik, CTR a o vývoji PNO s daleko lepší přesností.
Pro lepší vizualizaci je možné si do účtu vložit grafy a sledovat statistiky přímo v nich.
List “Měsíční výkon účtu”
Protože ve spolupráci mezi klientem a agenturou se hlavní reporty dělají měsíčně, je samozřejmě dostupný i list s měsíčním vývojem účtu. V tomto reportu je pěkný přehled o zisku účtu. Pokud svoji práci děláte správně, je právě tento sloupec dostatečným argumentem pro fakturu za odvedenou práci.
List – výkon kampaní
Samozřejmou součástí optimalizace návratnosti Adwords účtu je hledání, které z kampaní spíše prodělávají a se kterými je nutné něco dělat. A právě k tomu slouží report výkonu kampaní, kde jsou všechny metriky jako PNO, zisk/ztráta účtu, průměrná hodnota objednávky rozdělené dle kampaní.
Skript po vložení dat do listu automaticky seřadí kampaně v závislosti na jejich útratě. V tomto případě se dle mého názoru jedná o nejlepší řazení, protože nahoře se vyskytují kampaně, které Vás stojí nejvíce peněz. V případě, že jsou buňky červené (díky ztrátě kampaně, či špatnému PNO) je nutné jednat dříve u kampaní, které jsou v tabulce na vyšší pozici.
Určitě bych se v tomto reportu zastavil u automaticky dopočítávaného sloupce “průměrná hodnota objednávky”, který dle mého názoru chybí v prostředí Adwords. Pro mě se u PNO optimalizace kampaní jedná o jednu ze zásadních metrik, která mi pomáhají odhadnout nabídku na proklik pro danou kampaň / sestavu / klíčové slovo. Můžete mít v některých sestavách skvělou cenu konverze, ale velmi bídnou průměrnou cenu objednávky a díky tomu špatné PNO a především ztrátu dané kampaně.
Co bych určitě rád dodělal do skriptu, je možnost nastavit pro jednotlivé kampaně / sestavy vlastní marži. Týká se to hlavně klientů, kteří mají opravdu rozdílné marže napříč produkty. V takovém případě by bylo možné ručně nastavit pro dané sestavy marži a následně by skript počítal v přehledu PNO kampaní a reklamních sestav právě s danou marží. Otázkou je zda-li by stačilo nastavovat marže na úrovni kampaní nebo by bylo nutné nastavovat na úrovni reklamních sestav. Každý přeci jen používá trošku jinou strukturu účtu.
List “Historický výkon sestav“
Na listu historický výkon sestav naleznete stejné statistiky a metriky stahované za stejné období, jako na listu výkon kampaní. Vše je ovšem rozdělené po reklamních sestavách.
Jak skript nainstalovat do Vašeho účtu
1. Odeslání formuláře s URL adresou sešitu
Vzhledem k tomu, že skript je zpracován tak, aby dokázal vytvořit jednotlivé listy s přehledy i s nastavením, není nutné kopírovat nějakou šablonu skriptu apod. Stačí si pouze vytvořit novou tabulku a vložit její URL do formuláře níže spolu s emailem. Následně Vám náš systém vygeneruje skript, který bude data posílat přímo do Vaší tabulky. (My samozřejmě k tabulce přístup mít nebudeme a ani to není možné. Tento systém instalace slouží pro co nejsnažší nastavení.)
2. Vložím obsah textového souboru jako nový skript
Jakmile budete mít skript, který Vám vygenerujeme, stačí jít do sekce “Hromadná knihovna” > “Skripty”, kde zvolíme vložit nový skript a celý obsah zkopírujeme. Bude nutné povolit odesílání emailů skriptem a možnost práce s Vaším Google diskem. Poté jen nastavte automatické spouštění skriptu denně.
Co bych rád ve skriptu vylepšil
- Pro některé účely používám průměrné skóre kvality dané kampaně / reklamní sestavy. Určitě by nebylo špatné i tuto hodnotu mít ve sloupečku.
- Když díky nastavení skriptu víme, jakou máme marži, bylo by možné na základě dopočítané průměrné objednávky a konverzního poměru spočítat maximální cenu za proklik pro návratnost kampaně. To by mohlo pomoci při rozhodování, co s nerentabilní kampaní dělat. Když uvidíme, že mám průměrnou pozici 2 a potřebuji platit o 2 Kč za proklik méně, tak mám dvě možnosti, zlepšit skóre kvality a tím ušetřit a nebo snížit nabídky a snažit se skóre kvality nezhoršit.
- Možnost nastavení automatické úpravy nabídek právě na základě zisku, ztráty na úrovni jednotlivých klíčových slov. Z tohoto mám trošku strach. Programátorsky to není problém, ale bojím se určitých situací, které budou vést k příliš vysoké nabídce nebo které budou naopak zbytečně kampaně tlumit. Se skriptem pro optimalizaci nabídek si již nějaký čas hraji a testuji, jak jej ideálně nastavit.
Zdrojový kód skriptu
Skript vyžaduje naši základní sadu funkcí ve verzi minimálně 1.1 – přidejte ji před samotný skript. Při použití formuláře pro generování skriptu získáte vše nastavené a propojené, tento krok tak nebude třeba.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
/* Lynt basic functions */ //Version: 1.1 //Correct timezone offet if inserted date is in daylight saving time function lynt_DST(datum, offset){ var yr = datum.getFullYear(); var dst_start = new Date("March 14, " + yr +" 02:00:00"); var dst_end = new Date("November 07, " + yr +" 02:00:00"); var day = dst_start.getDay(); dst_start.setDate(14-day); day = dst_end.getDay(); dst_end.setDate(7-day); if (datum >= dst_start && datum < dst_end){ return offset+1; } else { return offset; } } //Creating or returning selected sheet function createOrGetSheet(reportSpreadsheet, name, position) { var sheet = reportSpreadsheet.getSheetByName(name); if(sheet == null) { return reportSpreadsheet.insertSheet(name,position); } else { return sheet; } } //Getting data for x days back in right format for AWQL query function lynt_get_date(pocet_dni) { var minule = new Date(); //kdyz je letni cas, tak o hodinu dele (GMT+1) var offset = lynt_DST(minule,1); minule.setTime(minule.getTime() - (1000 * 60 * 60 * (24) * pocet_dni) + offset); return lynt_format_awql_date(minule); } //Getting always last sunday with right formats for AWQL function lynt_get_sunday() { var minule = new Date(); //kdyz je letni cas, tak o hodinu dele (GMT+1) var offset = lynt_DST(minule,1); minule.setTime(minule.getTime() - (1000 * 60 * 60 * (24) * (minule.getDay())) + offset); return lynt_format_awql_date(minule); } //Getting x days from last sunday right formated for AWQL function lynt_get_xdays_back_from_sunday(pocet_dni) { var minule = new Date(); //kdyz je letni cas, tak o hodinu dele (GMT+1) var offset = lynt_DST(minule,1); minule.setTime(minule.getTime() - (1000 * 60 * 60 * (24) * pocet_dni) - (1000 * 60 * 60 * 24 * (minule.getDay()))+ offset); return lynt_format_awql_date(minule); } //Format date for AWQL function lynt_format_awql_date(datum){ return datum.getUTCFullYear()+("0"+(datum.getUTCMonth()+1)).slice(-2)+("0"+datum.getUTCDate()).slice(-2); } /* End of Lynt basic functions */ /* Lynt PNO script */ //Version 1.0 function main() { //Openning spreadsheet and setting up spreadsheet location for english because of numbers format var reportSpreadsheet = SpreadsheetApp.openByUrl(""); // Vložte URL Vašeho sešitu reportSpreadsheet.setSpreadsheetLocale('en'); reportSpreadsheet.setSpreadsheetTimeZone("Europe/Prague"); //Creating new list with settings, changing columns width and borders for settings area var sheetSettings = reportSpreadsheet.getSheetByName("Nastavení"); if (sheetSettings == null) { reportSpreadsheet.insertSheet("Nastavení", 0); var sheetSettings = reportSpreadsheet.getSheetByName("Nastavení"); var settingsInput = sheetSettings.getRange(1,1,6,3).setValues([ ["Nastavení skriptu, vložte do buňky vedle daná data","Vaše nastavení","Příklad"], ["Vaše marže v %",30,30],["Při jakém denní ztrátě chcete být upozornění",0,500], ["Váš email pro upozornění","","jakub.kasparu@lynt.cz"], ["Předmět emailu","Ztráta","Název účtu - včera vznikla ztráta"], ["Kolik dní zpátky koukat na kampaně a sestavy",150,150]]); sheetSettings.setColumnWidth(1, 330); sheetSettings.setColumnWidth(2, 200); sheetSettings.setColumnWidth(3, 200); sheetSettings.getRange(1,1,6,3).setBorder(true, true, true, true, true, true); } //Deleting 'list 1' sheet var sheetList1 = reportSpreadsheet.getSheetByName("List 1"); if (sheetList1 != null) { reportSpreadsheet.deleteSheet(sheetList1); } //Deleting "Sheet 1" sheet var sheetSheet1 = reportSpreadsheet.getSheetByName("Sheet1"); if (reportSpreadsheet.getSheetByName("Sheet1") != null) { reportSpreadsheet.deleteSheet(sheetSheet1); } // Testing if there is sheet with data created. var sheetDailyAccountOverview = createOrGetSheet(reportSpreadsheet,"Denní výkon účtu",1); // Testing if there is sheet with data created. var sheetWeeklyAccountOverview = createOrGetSheet(reportSpreadsheet,"Týdenní výkon účtu",2); // Testing if there is sheet with data created. var sheetMonthlyOverview = createOrGetSheet(reportSpreadsheet,"Měsíční výkon účtu",3); // Testing if there is sheet with data created. var campaingsPerformance = createOrGetSheet(reportSpreadsheet,"Výkon kampaní",4); // Testing if there is sheet with data created. var adGroupPerformance = createOrGetSheet(reportSpreadsheet,"Historický výkon sestav",5); // Preparing right data format for AWQL query var reportDateRange = lynt_get_date(60) + "," + lynt_get_date(1); //Combine var in right format for select //Getting daily account overview report var report = AdWordsApp.report( " SELECT Date, Cost, Impressions, Clicks, AverageCpc, Ctr, AveragePosition, Conversions, CostPerAllConversion, ConversionValue " + " FROM ACCOUNT_PERFORMANCE_REPORT " + " DURING "+ reportDateRange); //Exporting data to sheet sheetDailyAccountOverview.clearContents(); report.exportToSheet(sheetDailyAccountOverview); sheetDailyAccountOverview.sort(1, true); //Changing header for cz var headerColumns = sheetDailyAccountOverview.getRange(1,1,1,13); headerColumns.setValues([["Datum","Náklady","Počet zobrazení","Prokliky","Průměrné CPC","CTR","Prům. Pozice","Konverze","Cena konverze","Celk. hodnota konverzí","Průměrná objednávka","PNO","Zisk/Ztráta"]]); headerColumns.setFontWeight("bold"); //Creating new column with avg order value var lastRow = sheetDailyAccountOverview.getLastRow(); //Count last row in data var avgOrder = sheetDailyAccountOverview.getRange("K2:K"+ lastRow); avgOrder.setFormula("=J2/H2"); //Creating new column with PNO with Google sheet script var lastRow = sheetDailyAccountOverview.getLastRow(); //Count last row in data var pnoRange = sheetDailyAccountOverview.getRange("L2:L"+ lastRow); pnoRange.setFormula("=IF(J2=0,,B2/(J2/100))"); //Creating new column with profit values based on spreadsheet formula var profitRange = sheetDailyAccountOverview.getRange("M2:M"+ lastRow); var profit = sheetSettings.getRange("B2").getValue() / 100; profitRange.setFormula("=J2*'Nastavení'!$B$2/100-B2"); //Part below creates conditional formats for profit column for(i = 2;i <= lastRow; i++) { var profitLoss = sheetDailyAccountOverview.getRange(i, 13).getValue(); if(profitLoss <= 0) { sheetDailyAccountOverview.getRange(i, 13).setBackground("#FFC2B2"); } else { sheetDailyAccountOverview.getRange(i, 13).setBackground("#CCF5CC"); } } //Part below creates conditional formats for PNO column for(i = 2;i <= lastRow; i++) { var pnoForConditional = sheetDailyAccountOverview.getRange(i, 12).getValue(); if(pnoForConditional >= profit * 100) { sheetDailyAccountOverview.getRange(i, 12).setBackground("#FFC2B2"); } else { sheetDailyAccountOverview.getRange(i, 12).setBackground("#CCF5CC"); } } //Creating Weekly performance report var reportDateRange = lynt_get_xdays_back_from_sunday(139) + "," + lynt_get_sunday(); sheetWeeklyAccountOverview.clearContents(); var report = AdWordsApp.report( " SELECT Week, Cost, Impressions, Clicks, AverageCpc, Ctr, AveragePosition, Conversions, CostPerAllConversion, ConversionValue " + " FROM ACCOUNT_PERFORMANCE_REPORT " + " DURING "+ reportDateRange); //Exporting data to sheet sheetWeeklyAccountOverview.clearContents(); report.exportToSheet(sheetWeeklyAccountOverview); sheetWeeklyAccountOverview.sort(1, true); //Changing header for cz var headerColumns = sheetWeeklyAccountOverview.getRange(1,1,1,13); headerColumns.setValues([["Týden","Náklady","Počet zobrazení","Prokliky","Průměrné CPC","CTR","Prům. Pozice","Konverze","Cena konverze","Celk. hodnota konverzí","Průměrná objednávka","PNO","Zisk/Ztráta"]]); headerColumns.setFontWeight("bold"); //Creating new column with avg order value var lastRow = sheetWeeklyAccountOverview.getLastRow(); //Count last row in data var avgOrder = sheetWeeklyAccountOverview.getRange("K2:K"+ lastRow); avgOrder.setFormula("=J2/H2"); //Creating new column with PNO with Google sheet script var lastRow = sheetWeeklyAccountOverview.getLastRow(); //Count last row in data var pnoRange = sheetWeeklyAccountOverview.getRange("L2:L"+ lastRow); pnoRange.setFormula("=IF(J2=0,,B2/(J2/100))"); //Creating new column with profit values based on spreadsheet formula var profitRange = sheetWeeklyAccountOverview.getRange("M2:M"+ lastRow); var profit = sheetSettings.getRange("B2").getValue() / 100; profitRange.setFormula("=J2*'Nastavení'!$B$2/100-B2"); //Part below creates conditional formats for profit column for(i = 2;i <= lastRow; i++) { var profitLoss = sheetWeeklyAccountOverview.getRange(i, 13).getValue(); if(profitLoss <= 0) { sheetWeeklyAccountOverview.getRange(i, 13).setBackground("#FFC2B2"); } else { sheetWeeklyAccountOverview.getRange(i, 13).setBackground("#CCF5CC"); } } //Part below creates conditional formats for PNO column for(i = 2;i <= lastRow; i++) { var pnoForConditional = sheetWeeklyAccountOverview.getRange(i, 12).getValue(); if(pnoForConditional >= profit * 100) { sheetWeeklyAccountOverview.getRange(i, 12).setBackground("#FFC2B2"); } else { sheetWeeklyAccountOverview.getRange(i, 12).setBackground("#CCF5CC"); } } //Creating Monthly performance report var reportDateRange = lynt_get_xdays_back_from_sunday(365) + "," + lynt_get_date(1) sheetMonthlyOverview.clearContents(); var report = AdWordsApp.report( " SELECT Month, Cost, Impressions, Clicks, AverageCpc, Ctr, AveragePosition, Conversions, CostPerAllConversion, ConversionValue " + " FROM ACCOUNT_PERFORMANCE_REPORT " + " DURING "+ reportDateRange); //Exporting data to sheet sheetMonthlyOverview.clearContents(); report.exportToSheet(sheetMonthlyOverview); sheetMonthlyOverview.sort(1, true); //Changing header for cz var headerColumns = sheetMonthlyOverview.getRange(1,1,1,13); headerColumns.setValues([["Měsíc","Náklady","Počet zobrazení","Prokliky","Průměrné CPC","CTR","Prům. Pozice","Konverze","Cena konverze","Celk. hodnota konverzí","Průměrná objednávka","PNO","Zisk/Ztráta"]]); headerColumns.setFontWeight("bold"); //Creating new column with avg order value var lastRow = sheetMonthlyOverview.getLastRow(); //Count last row in data var avgOrder = sheetMonthlyOverview.getRange("K2:K"+ lastRow); avgOrder.setFormula("=J2/H2"); //Creating new column with PNO with Google sheet script var lastRow = sheetMonthlyOverview.getLastRow(); //Count last row in data var pnoRange = sheetMonthlyOverview.getRange("L2:L"+ lastRow); pnoRange.setFormula("=IF(J2=0,,B2/(J2/100))"); //Creating new column with profit values based on spreadsheet formula var profitRange = sheetMonthlyOverview.getRange("M2:M"+ lastRow); var profit = sheetSettings.getRange("B2").getValue() / 100; profitRange.setFormula("=J2*'Nastavení'!$B$2/100-B2"); //Part below creates conditional formats for profit column for(i = 2;i <= lastRow; i++) { var profitLoss = sheetMonthlyOverview.getRange(i, 13).getValue(); if(profitLoss <= 0) { sheetMonthlyOverview.getRange(i, 13).setBackground("#FFC2B2"); } else { sheetMonthlyOverview.getRange(i, 13).setBackground("#CCF5CC"); } } //Part below creates conditional formats for PNO column for(i = 2;i <= lastRow; i++) { var pnoForConditional = sheetMonthlyOverview.getRange(i, 12).getValue(); if(pnoForConditional >= profit * 100) { sheetMonthlyOverview.getRange(i, 12).setBackground("#FFC2B2"); } else { sheetMonthlyOverview.getRange(i, 12).setBackground("#CCF5CC"); } } //Creating Campaign performance report var reportDateRange = lynt_get_date(sheetSettings.getRange("B6").getValue()) + "," + lynt_get_date(1); campaingsPerformance.clearContents(); var report = AdWordsApp.report( " SELECT CampaignName, Cost, Impressions, Clicks, AverageCpc, Ctr, AveragePosition, Conversions, CostPerAllConversion, ConversionValue " + " FROM CAMPAIGN_PERFORMANCE_REPORT " + " WHERE CampaignStatus = ENABLED" + " AND Clicks > 50" + " DURING " + reportDateRange); //Exporting data to sheet campaingsPerformance.clearContents(); report.exportToSheet(campaingsPerformance); campaingsPerformance.sort(2, false); //Changing header for cz var headerColumns = campaingsPerformance.getRange(1,1,1,13); headerColumns.setValues([["Název Kampaně","Náklady","Počet zobrazení","Prokliky","Průměrné CPC","CTR","Prům. Pozice","Konverze","Cena konverze","Celk. hodnota konverzí","Průměrná objednávka","PNO","Zisk/Ztráta"]]); headerColumns.setFontWeight("bold"); //Creating new column with avg order value var lastRow = campaingsPerformance.getLastRow(); //Count last row in data var avgOrder = campaingsPerformance.getRange("K2:K"+ lastRow); avgOrder.setFormula("=IF(H2=0,,J2/H2)"); //Creating new column with PNO with Google sheet script var lastRow = campaingsPerformance.getLastRow(); //Count last row in data var pnoRange = campaingsPerformance.getRange("L2:L"+ lastRow); pnoRange.setFormula("=IF(J2=0,,B2/(J2/100))"); //Creating new column with profit values based on spreadsheet formula var profitRange = campaingsPerformance.getRange("M2:M"+ lastRow); var profit = sheetSettings.getRange("B2").getValue() / 100; profitRange.setFormula("=J2*'Nastavení'!$B$2/100-B2"); //Part below creates conditional formats for profit column for(i = 2;i <= lastRow; i++) { var profitLoss = campaingsPerformance.getRange(i, 13).getValue(); if(profitLoss <= 0) { campaingsPerformance.getRange(i, 13).setBackground("#FFC2B2"); } else { campaingsPerformance.getRange(i, 13).setBackground("#CCF5CC"); } } //Part below creates conditional formats for PNO column for(i = 2;i <= lastRow; i++) { var pnoForConditional = campaingsPerformance.getRange(i, 12).getValue(); if(pnoForConditional >= profit * 100) { campaingsPerformance.getRange(i, 12).setBackground("#FFC2B2"); } else { campaingsPerformance.getRange(i, 12).setBackground("#CCF5CC"); } } //Creating Ad_group performance report var reportDateRange = lynt_get_date(sheetSettings.getRange("B6").getValue()) + "," + lynt_get_date(1); adGroupPerformance.clearContents(); var report = AdWordsApp.report( " SELECT AdGroupName, CampaignName, Cost, Impressions, Clicks, AverageCpc, Ctr, AveragePosition, Conversions, CostPerAllConversion, ConversionValue " + " FROM ADGROUP_PERFORMANCE_REPORT " + " WHERE" + " AdGroupStatus = ENABLED" + " AND CampaignStatus = ENABLED" + " AND Clicks > 50" + " DURING " + reportDateRange); //Exporting data to sheet adGroupPerformance.clearContents(); report.exportToSheet(adGroupPerformance); adGroupPerformance.sort(3, false); adGroupPerformance.setFrozenColumns(2); //Changing header for cz var headerColumns = adGroupPerformance.getRange(1,1,1,14); headerColumns.setValues([["Název sestavy","Název Kampaně","Náklady","Počet zobrazení","Prokliky","Průměrné CPC","CTR","Prům. Pozice","Konverze","Cena konverze","Celk. hodnota konverzí","Průměrná objednávka","PNO","Zisk/Ztráta"]]); headerColumns.setFontWeight("bold"); //Creating new column with avg order value var lastRow = adGroupPerformance.getLastRow(); //Count last row in data var avgOrder = adGroupPerformance.getRange("L2:L" + lastRow); avgOrder.setFormula("=IF(I2=0,,K2/I2)"); //Creating new column with PNO with Google sheet script var lastRow = adGroupPerformance.getLastRow(); //Count last row in data var pnoRange = adGroupPerformance.getRange("M2:M" + lastRow); pnoRange.setFormula("=IF(K2=0,,C2/(K2/100))"); //Creating new column with profit values based on spreadsheet formula var profitRange = adGroupPerformance.getRange("N2:N" + lastRow); var profit = sheetSettings.getRange("B2").getValue() / 100; profitRange.setFormula("=K2*'Nastavení'!$B$2/100-C2"); //Part below creates conditional formats for profit column for(i = 2;i <= lastRow; i++) { var profitLoss = adGroupPerformance.getRange(i, 14).getValue(); if(profitLoss <= 0) { adGroupPerformance.getRange(i, 14).setBackground("#FFC2B2"); } else if(profitLoss > 0 && profitLoss != null){ adGroupPerformance.getRange(i, 14).setBackground("#CCF5CC"); } } //Part below creates conditional formats for PNO column for(i = 2;i <= lastRow; i++) { var pnoForConditional = adGroupPerformance.getRange(i, 13).getValue(); if(pnoForConditional >= profit * 100) { adGroupPerformance.getRange(i, 13).setBackground("#FFC2B2"); } else { adGroupPerformance.getRange(i, 13).setBackground("#CCF5CC"); } } //If there is bigger loss than your settings, scripts will send you email with alert var alertEmail = sheetSettings.getRange("B4").getValue(); if(sheetDailyAccountOverview.getRange("M61").getValue() <= sheetSettings.getRange("B3").getValue()) { MailApp.sendEmail(alertEmail, sheetSettings.getRange("B5").getValue(),"Včera jsme zaznamenali ztrátu na Vašem účtě ve výši "+ sheetDailyAccountOverview.getRange("M61").getValue()+" Kč"); } //If your account daily spend = 0, you will get aler email if(sheetDailyAccountOverview.getRange("B61").getValue() == 0) { MailApp.sendEmail(alertEmail, sheetSettings.getRange("B5").getValue()+" Neaktivní kampaně","Na Vašem Adwords účtu není kredit"); } } /* End of Lynt PNO script */ |
Petr says
Velmi pěkný. Budou k dispozici později i dané scripty? Někteří zdatnější si to nastaví třeba i sami 🙂
Jakub Kašparů says
Dobrý den,
jakmile vyplníte email, jméno a URL sheetu (nemusíte ani zadávat, stačí vložit cokoliv), tak Vám na email přijde kompletní skript v textovém souboru. Jsou dva důvody proč není skript přímo vložen do článku.
Za prvé má přes 400 řádků kódu a vcelku by se článek protáhl.
Za druhé pro snažší implementaci. Stačí pouze vzít přílohu emailu a vložit do Vašeho Adwords účtu a ono to funguje. Není potřeba nic nahrazovat.
Každopádně děkuji za komentář.
Martin Staník says
Můžu jen doporučit funguje bezvadně. Možná bych je zdůraznil, že Google tabulka musí být vytvořena ve stejném účtu jako je účet Adwords. Jinak instalace je rychlá a snadná.
Jakub Kašparů says
Dobrý den, děkuji a jsem rád, že všechno funguje, jak má 🙂 Ano opravdu je nutné mít dokument na stejném Google Disku, jako je Váš Adwords účet.
Milan Merglevský says
Ahoj,
funguje to opravdu skvěle. Je ještě možné do výpočtu PNO zařadit pohled přes jiný atribuční model? Ideálně data drive :-).
David says
Ahoj, funguje výtečně. Je to super věc, moc díky!
Jakub Kašparů says
Ahoj, jsem moc rád, že vše běží jak má 🙂 A děkuji za pochvalu, ta se hodí vždycky.
Dalibor says
Dnes jsem si nainstaloval a bomba. Moc nám to pomůže. Díky. Dalibor
Jakub Kašparů says
To jsem rád 🙂