Adwords skript pro měření PNO a zisku / ztráty účtu
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.
/* 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 */
Komentáře 9
Petr
Jakub Kašparů
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
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ů
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ý
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
Ahoj, funguje výtečně. Je to super věc, moc díky!
Jakub Kašparů
Ahoj, jsem moc rád, že vše běží jak má 🙂 A děkuji za pochvalu, ta se hodí vždycky.
Dalibor
Dnes jsem si nainstaloval a bomba. Moc nám to pomůže. Díky. Dalibor
Jakub Kašparů
To jsem rád 🙂





Velmi pěkný. Budou k dispozici později i dané scripty? Někteří zdatnější si to nastaví třeba i sami 🙂