Разработка комплексной стратегии продвижения — полное руководствоскачайте бесплатно

Расширенный отчет по эффективности кампаний, объявлений и ключевых фраз, включая расширенный QS

functionmain() {

    var impressions_sum_total =0, clicks_sum_total =0, impressions_proc_sum_total =0,
        qs_sum_total =0, qs_e_sum_total =0, cost_sum_total =0, ctr_sum_total =0,
        topcpc_sum_total =0, firstpagecpc_sum_total =0, count_total =0;
    var max = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    //открываем гуглдокvar GOOGLE_DOC_URL ="https://docs.google.com/spreadsheets/d/1brBZhqv7t93WQJVQ50Y93wlAbYLJmO9wgk8wDS75Wh4/edit?usp=sharing";
    var spreadsheet = SpreadsheetApp.openByUrl(GOOGLE_DOC_URL);

    //фомируем название вкладки из текущей даты вида "2015.05.23"var currentDate =new Date();
    var day = currentDate.getDate();
    var month = currentDate.getMonth() +1;
    var year = currentDate.getFullYear();
    var name = day +"."+ (month < 10?'0'+ month : month) +"."+ year;

    //если вкладка с таким именем уже есть, удаляем еёvar cursheet = spreadsheet.getActiveSheet();
    if (cursheet) if (cursheet.getName() == name) spreadsheet.deleteSheet(cursheet);

    //добавялем новую вкладку вида "2015.05.23"var newSheet = spreadsheet.insertSheet(name, 0);

    //колонки + их форматированиеvar columnNames = ["Кампания", "Группа объявлений", "Фраза", "Кликов", "Показов",
        "Показов %", "QS фразы", "Расширенный QS", "CTR", "Cost", "TopOfPageCpc",
        "FirstPageCpc", "isPaused"];
    var headersRange = newSheet.getRange(1, 1, 1, columnNames.length);
    headersRange.setFontWeight("bold");
    headersRange.setFontSize(12);
    headersRange.setBorder(false, false, true, false, false, false);
    headersRange.setValues([columnNames]);
  
    newSheet.setFrozenRows(1);

    var campaignIterator = AdWordsApp.campaigns()
        .withCondition('Status = ENABLED')
        .get();
    //пробегаемся по кампаниямwhile (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next();
        var count_campaign =0;
        var keywords = [];

        Logger.log('Кампания: '+ campaign.getName());

        var adGroupIterator = campaign.adGroups()
            .withCondition('Status = ENABLED')
            .get();

        var impressions_campaign_sum =0, clicks_campaign_sum =0, impressions_proc_campaign_sum =0,
            qs_campaign_sum =0, qs_e_campaign_sum =0, cost_campaign_sum =0,
            ctr_campaign_sum =0, topcpc_campaign_sum =0, firstpagecpc_campaign_sum =0;


        //пробегаемся по группамwhile (adGroupIterator.hasNext()) {
            var adGroup = adGroupIterator.next();
            var campaign_name = (adGroup.getCampaign() ? adGroup.getCampaign().getName() :'');

            Logger.log('Группа: '+ adGroup.getName());

            keywords = [];

            var keywordIterator = adGroup.keywords().get();

            //считаем показы кейвордов всей группы за неделю// (чтобы потом посчитать % показов для каждого кейворда)var all_impressions =0;
            while (keywordIterator.hasNext()) {
                var keyword = keywordIterator.next();
                var stats = keyword.getStatsFor("LAST_WEEK");
                all_impressions = all_impressions + stats.getImpressions();
            }

            //собираем данные по каждому кейворду группы в массив,// дабы после отсортировать и вывести в гуглдокvar keywordIterator = adGroup.keywords().get();
            var impressions_sum =0, clicks_sum =0, impressions_proc_sum =0, qs_sum =0,
                qs_e_sum =0, cost_sum =0, ctr_sum =0, topcpc_sum =0, firstpagecpc_sum =0, ctr_not_zero_count =0;
            while (keywordIterator.hasNext()) {
                var keyword = keywordIterator.next();

                //берем статус за посл. неделюvar stats = keyword.getStatsFor("LAST_WEEK");

                //если показов не было, то кейворд не берем в гуглдокvar impressions = stats.getImpressions();
                if (!impressions) continue;

                //берем кликиvar clicks = stats.getClicks();

                //считаем процент показовvar impressions_proc =
                    Math.round((all_impressions > 0? impressions / all_impressions *100:0) *100) /100;

                //берем CTR и Costvar ctr = Math.round(stats.getCtr() *1000) /10;
                var cost = Math.round(stats.getCost());


                //берем QualityScorevar qs = keyword.getQualityScore();
                //процент QSvar qs_e = Math.round(impressions_proc * qs);

                //берем MaxCpcvar maxcpc = keyword.getMaxCpc();

                //берем TopOfPageCpcvar topcpc = keyword.getTopOfPageCpc();

                //берем FirstPageCpcvar firstpagecpc = keyword.getFirstPageCpc();

                //берем статусvar ispaused = keyword.isPaused();
                var keytext = keyword.getText();
                //для фраз начинающихся на + добавляем в начало кавычку,// иначе гуглдок расценит это как спецсимвол и не отобразит данные в ячейкеif (keytext[0] =='+') keytext ="'"+ keytext;

                //добавялем все эти данные в массив
                keywords.push([campaign_name,
                    adGroup.getName(), keytext, clicks, impressions, impressions_proc, qs, qs_e,
                    ctr, cost, topcpc, firstpagecpc, ispaused]);

                //считаем сумму показателей для вывода ИТОГО,// среднего и максимального для каждой колонки, для группы и кампании
                clicks_sum += clicks;
                impressions_sum += impressions;
                impressions_proc_sum += impressions_proc;
                qs_sum += qs;
                qs_e_sum += qs_e;
                ctr_sum += ctr;
                if(ctr > 0) ctr_not_zero_count++;
                cost_sum += cost;
                firstpagecpc_sum += firstpagecpc;
                topcpc_sum += topcpc;

                clicks_campaign_sum += clicks;
                impressions_campaign_sum += impressions;
                impressions_proc_campaign_sum += impressions_proc;
                qs_campaign_sum += qs;
                qs_e_campaign_sum += qs_e;
                ctr_campaign_sum += ctr;
                cost_campaign_sum += cost;
                firstpagecpc_campaign_sum += firstpagecpc;
                topcpc_campaign_sum += topcpc;

                clicks_sum_total += clicks;
                impressions_sum_total += impressions;
                impressions_proc_sum_total += impressions_proc;
                qs_sum_total += qs;
                qs_e_sum_total += qs_e;
                ctr_sum_total += ctr;
                cost_sum_total += cost;
                firstpagecpc_sum_total += firstpagecpc;
                topcpc_sum_total += topcpc;                

                if (clicks > max[4]) max[4] = clicks;
                if (impressions > max[5]) max[5] = impressions;
                if (impressions_proc > max[6]) max[6] = impressions_proc;
                if (qs > max[7]) max[7] = qs;
                if (qs_e > max[8]) max[8] = qs_e;
                if (ctr > max[9]) max[9] = ctr;
                if (cost > max[10]) max[10] = cost;
                if (topcpc > max[11]) max[11] = topcpc;
                if (firstpagecpc > max[12]) max[12] = firstpagecpc;
            }


            //если в группе нашлись кейворды с показами, сортируем их и выводим в гуглдок всю пачкуvar count = keywords.length;
            count_total += count;
            count_campaign += count;
            if (count > 0) {
                Logger.log('Сортируем ключи: '+ keywords.length +' шт.');
                keywords = usort(keywords, impressionsDesc);
                for (var i in keywords) {
                    Logger.log('Пишу: '+ keywords[i][2]);
                    newSheet.appendRow(keywords[i]);
                }

                //вывод ИТОГО для группы
                newSheet.appendRow(['Итого для группы '+ adGroup.getName()
                +':', '', '', clicks_sum, Math.round(impressions_sum),
                    Math.round(impressions_proc_sum), Math.round(qs_sum / count),
                                    Math.round(qs_e_sum / count), (ctr_not_zero_count ? Math.round(ctr_sum / ctr_not_zero_count) :0), Math.round(cost_sum),
                    Math.round(topcpc_sum / count), Math.round(firstpagecpc_sum / count)]);
                newSheet.getRange(newSheet.getLastRow(), 1, 1, newSheet.getLastColumn())
                    .setBackground('#ACDFF7').setFontWeight("bold");
            }

        }

        if (impressions_campaign_sum) {
            //вывод ИТОГО для кампании
            newSheet.appendRow(['Итого для кампании '+ campaign.getName()
            +':', '', '', clicks_campaign_sum, Math.round(impressions_campaign_sum),
                Math.round(impressions_proc_campaign_sum),
                Math.round(qs_campaign_sum / count_campaign),
                Math.round(qs_e_campaign_sum / count_campaign), Math.round(ctr_campaign_sum / count_campaign),
                Math.round(cost_campaign_sum),
                Math.round(topcpc_campaign_sum / count_campaign),
                Math.round(firstpagecpc_campaign_sum / count_campaign)]);
            newSheet.getRange(newSheet.getLastRow(), 1, 1, newSheet.getLastColumn())
                .setBackground('#5CDFF7').setFontWeight("bold");
            newSheet.appendRow([' ']);

            impressions_campaign_sum =0, clicks_campaign_sum =0, impressions_proc_campaign_sum =0,
                qs_campaign_sum =0, qs_e_campaign_sum =0, cost_campaign_sum =0,
                ctr_campaign_sum =0, topcpc_campaign_sum =0, firstpagecpc_campaign_sum =0;
        }
    }

    //вывод общего ИТОГО
    newSheet.insertRowAfter(1);
    newSheet.appendRow(['Общий итог:', '', '', clicks_sum_total, Math.round(impressions_sum_total),
        Math.round(impressions_proc_sum_total), Math.round(qs_sum_total / count_total),
        Math.round(qs_e_sum_total / count_total), Math.round(ctr_sum_total / count_total),
        Math.round(cost_sum_total), Math.round(topcpc_sum_total / count_total),
        Math.round(firstpagecpc_sum_total / count_total)]);
    newSheet.getRange(newSheet.getLastRow(), 1, 1, newSheet.getLastColumn())
        .setBackground('#A685E0').setFontWeight("bold").moveTo(newSheet.getRange("A2"));
  
    //перекраска колонокfor (var j =4; j <=12; j++) {
        var colors = ['#f8696b', '#faa274', '#ccdd81', '#9acd7e'];
        if (j > 9)  colors = colors.reverse();

        for (var i =2; i <= newSheet.getLastRow() -2; i++) {
            var cell = newSheet.getRange(i, j);
            if (cell.getBackground() !='#ffffff') continue;

            for (var part =1; part < 5; part++) {
                if (cell.getValue() !=='')
                    if ((cell.getValue() < max[j] /4* part && cell.getValue() >= max[j] /4* (part -1))
                        || (part ==4&& cell.getValue() == max[j]))
                        cell.setBackground(colors[part -1]);
            }

        }
    }
  
    for (var i =2; i <= newSheet.getLastRow() -2; i++) {
      var cell = newSheet.getRange(i, 13);
      if (cell.getBackground() !='#ffffff') continue;
      if (cell.getValue()) cell.setBackground('#f8696b');
    }

    //автоматический размер колонок
    newSheet.autoResizeColumn(1).autoResizeColumn(2)
        .autoResizeColumn(3).autoResizeColumn(7)
        .autoResizeColumn(8).autoResizeColumn(9)
        .autoResizeColumn(10).autoResizeColumn(11);
}

//функции для сортировки массиваfunctionusort(inputArr, sorter) {

    var valArr = [],
        k ='',
        i =0,
        strictForIn = false,
        populateArr = {};

    if (typeof sorter ==='string') {
        sorter = this[sorter];
    } elseif (Object.prototype.toString.call(sorter) ==='[object Array]') {
        sorter = this[sorter[0]][sorter[1]];
    }
    this.php_js = this.php_js || {};
    this.php_js.ini = this.php_js.ini || {};
    strictForIn = this.php_js.ini['phpjs.strictForIn']
    && this.php_js.ini['phpjs.strictForIn'].local_value && this.php_js
        .ini['phpjs.strictForIn'].local_value !=='off';
    populateArr = strictForIn ? inputArr : populateArr;

    for (k in inputArr) {
        if (inputArr.hasOwnProperty(k)) {
            valArr.push(inputArr[k]);
            if (strictForIn) {
                delete inputArr[k];
            }
        }        
    }
    try {
        valArr.sort(sorter);
    } catch (e) {
        return false;
    }
    for (i =0; i < valArr.length; i++) {
        populateArr[i] = valArr[i];
    }

    return strictForIn || populateArr;
}

functionimpressionsDesc(a, b) {
    return b[3] - a[3];
}