• Skip to main content
  • Skip to primary sidebar

PPC Scripts

by Lynt services

  • Workshop: Automatizace PPC (Praha, Brno)
  • PPC služby
  • Pár slov o blogu
  • Angličtina
  • Čeština
Jste zde: Domů / Adwords skripty / Adwords skript pro měření PNO a zisku / ztráty účtu

Adwords skript pro měření PNO a zisku / ztráty účtu

18 září, 2015 od Jakub Kašparů 9 Comments

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í”.

Nastavení Adwords skriptu na PNO

Co zde můžete nastavit:

  1. Jakou marži má Adwords skript brát v úvahu při výpočtů ziskovosti účtu.
  2. Při jaké denní ztrátě účtu chcete dostat upozornění na email.
  3. Na jaký email budou daná upozornění chodit.
  4. 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é.
  5. 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í:

  1. 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.
  2. 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).

Denní přehled Adwords účtu

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.

Týdenní přehled Adwords účtu

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.

Přehled výkonu kampaní

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í.)

    Chci si nechat vygenerovat tento skript na míru

    Vaše jméno (vyžadováno)

    Váš email (vyžadováno)

    Cílový Google sheet (vyžadováno)

    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ě.

    Jak vložit Adwords skript

    Co bych rád ve skriptu vylepšil

    1. 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.
    2. 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.
    3. 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.

    AdWords skript - PNO
    JavaScript
    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 */

     

    Kategorie:Adwords skripty

    Reader Interactions

    Comments

    1. Petr says

      23 září, 2015 at 5:49 pm

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

      Odpovědět
      • Jakub Kašparů says

        23 září, 2015 at 5:57 pm

        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ář.

        Odpovědět
    2. Martin Staník says

      30 listopadu, 2015 at 5:03 pm

      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á.

      Odpovědět
      • Jakub Kašparů says

        30 listopadu, 2015 at 7:19 pm

        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.

        Odpovědět
    3. Milan Merglevský says

      10 ledna, 2016 at 9:32 am

      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 :-).

      Odpovědět
    4. David says

      28 ledna, 2016 at 9:50 am

      Ahoj, funguje výtečně. Je to super věc, moc díky!

      Odpovědět
      • Jakub Kašparů says

        28 ledna, 2016 at 9:51 am

        Ahoj, jsem moc rád, že vše běží jak má 🙂 A děkuji za pochvalu, ta se hodí vždycky.

        Odpovědět
    5. Dalibor says

      5 května, 2016 at 12:56 pm

      Dnes jsem si nainstaloval a bomba. Moc nám to pomůže. Díky. Dalibor

      Odpovědět
      • Jakub Kašparů says

        5 května, 2016 at 12:58 pm

        To jsem rád 🙂

        Odpovědět

    Napsat komentář Zrušit odpověď na komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *


    Primary Sidebar

    Naplánované WorkShopy a školení

    • Automatizace PPC kampaní 9.6.17 – Praha
    Google Partner

    Tools

    AWQL Generator
    Keyword Combinator
    Datastudio Case generator

    Autor blogu

    Jakub Kašparů, Lynt

    Jakub Kašparů

    Lynt services s.r.o.
    jakub.kasparu@lynt.cz
    724 806 769
    Twitter JKasparu
    LinkedIn LinkedIn

    Nejnovější příspěvky

    • Vychází PPC Robot 1.0 11 června, 2019
    • Co je důležité znát pro vytváření AWQL reportů 29 května, 2017
    • Rychlá analýza zákazníků pro PPC kampaně 20 října, 2016

    Nejnovější komentáře

    • Lukáš Kolovrat: Skript pro sledování nových a odstraněných produktů v eshopu
    • Lukáš Kolovrat: Nové možnosti reportingu v rámci Adwords skriptů Adwords API v201601
    • Danča: Skript, který porovnává organické dotazy z GA s dotazy z Adwords a hledá příležitosti

    RSS Blog Lynt.cz

    • Globální scan otevřených .git repozitářů
    • Vytvoření a použití SSH klíče pro Git ve Windows
    • 10% českých webů - přesměrování špatné a horší
    • Technické zpracování webů WebTop100 2019
    • Vychází PPC Robot 1.0

    RSS Blog Medio.cz

    • Zóny: Velká novinka v Google Tag Manageru
    • Kalendář akcí v internetovém marketingu pro rok 2018
    • SEO restart 2017 prezentace a odkazy

    © Copyright 2016 Lynt services s.r.o.