Мы у себя в сервисе отслеживаем ряд контрольных метрик. Посещения, регистрации, конверсии, активации, удержание, отток и тд. Метрики ведем в сводной таблице в Google Docs. Данные для метрик — собирались вручную из Google Analytics и из самого нашего сервиса. Потратив совсем немного времени, мы автоматизировали этот сбор.
За прототип сводной Excel таблицы брали финансовую модель Matthew Carroll для стартапов.
Данные в таблицу в Google Docs вбивались вручную. В итоге, я так и обновлял каждый месяц метрики вручную, пока не наткнулся на обзор про сервисы, которые позволяют визуализировать метрики
На западе таких сервисов уже много. Например:
DucksBoard
Totango
Kissmetrics
Мне еще раз захотелось автоматизировать этот процесс. Но поскольку сервисов было много, а таблица была уже настроена и “привычна”, я решил попробовать автоматизировать получения данных в саму таблицу в Google Docs с помощью Google Script
Итак, моя задача была:
- получить данные из Google Analytics за последний месяц
- получить данные из сервиса за последний месяц
- вставить данные в таблицу страницу, с форматированием
Потратив полдня на разбор документации, я написал простой скрипт, который можно использовать и для получения ваших метрик в ваш Excel файл
Создаем новый скрипт script.google.com/ ( у вас должны быть учетка Google )
2. копируем код
function setNewMetrics() { // выбираем Excel в который мы будем писать данные ////////////////// var ss = SpreadsheetApp.openById("0AjAbTD8WcDQMdC1MWmtUR3VlUWJTSHIzQ0dsSS1HSGc"); // Вставляем хеш вашей Excel страницы в которую будем писать !!!!!!!!!!!!!!!!!!!!! SpreadsheetApp.setActiveSpreadsheet(ss); var sheet= SpreadsheetApp.setActiveSheet(ss.getSheets()[1]); // выбираем страницу(sheet) в Excel файле !!!!!!!!!!!!!! Logger.log("Название страницы = "+sheet.getName()); // Проверяем, правильно ли мы выбрали страницу - запускаем скрипт "меню Run-> setNewMetrics" - жмем CNTRL + ENTER - смотрим лог var sCol = new Array(); // массив для данных, которые мы вставим в Excel // формируем дату var d = new Date(); var monthNames = [ "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" ]; var cMonth= d.getMonth(); var cYear = d.getFullYear(); cMonth= (cMonth + 12 - 1) % 12 // ищем прошлый месяц ( если надо статистику за 2 месяца назад "1" заменить на "2" ) if ( (cMonth-1) > 0 ) cYear--; // корректируем год, если январь var cMonth_str = monthNames[cMonth]; sCol[1] = cMonth_str+" "+cYear; // записали месяц // получаем данные из GA ///////////////////////////////////////////////////////////////////// //Перед тем как работать с API GA вам нужно "включить" API, подробная инструкция https://developers.google.com/analytics/solutions/articles/reporting-apps-script#registration // после нужно настроить получение вашего профайла в функции getProfile() ниже var sProfile=getProfile(); // выбираем и подключаем нужный профайл GA, функцию нужно настроить под свой профиль, смотрите ниже !!!!!! var oGA = getReportDataForProfile(sProfile).getTotalsForAllResults(); // получаем данные, метрики можно настроить в этой функции !!!!!! sCol[3] = oGA["ga:visits"]; // записали visits sCol[12] = oGA["ga:goalCompletionsAll"]/oGA["ga:visits"]; // получили конверсию Visit-> Trial Logger.log( "Данные из GA -> "+sCol[12]); // проверяем правильно ли получили GA данные // получаем и обрабатываем JSON файл с метриками, которые я забираю с сервиса ///////////////////////////////////////////////////////// // Надо поправить скрипт с учетом формата вашего JSON файла var opts = {"contentType":"multipart/form-data", "method" : "post",} var response = UrlFetchApp.fetch("http://YOURSITE.com/8IiXcnPkEi3W.json", opts); // я получаю метрики из сервиса в JSON формате в таком виде /* {"24":{"date":"February 2011","new_paid":"360","churn":2}, "23":{"date":"March 2011","new_paid":"38","churn":2}} */ var jsondata = response.getContentText(); jsondata = JSON.parse(jsondata); // парсим полученные данные в переменную jsondata for (var month in jsondata) { //Logger.log("==>"+month+jsondata[month] + jsondata[month]["date"]); if ( (cMonth_str+" "+ cYear) === jsondata[month]["date"] ) { // нашли данные за прошлый месяц - вносим их !!!!!!!!!!!!!! sCol[7] = jsondata[month]["new"]; sCol[8] = jsondata[month]["lost"]; sCol[22] = jsondata[month]["churn"]+"%"; sCol[23] = jsondata[month]["churn_paid"]+"%"; sCol[25] = jsondata[month]["ltv"]; } } // записываем в Excel /////////////////////////////////////////////////////////////// // я буду писать в последнюю колонку Excel файла. заполняем контентом последнюю колонку var sLastcolumn = sheet.getLastColumn()+1; var oRange = sheet.getRange(1,sLastcolumn ) ; for (var i=1; i<(sCol.length+1); i++) { if (sCol[i]) oRange.setValue(sCol[i]); // запись значения в ячейку oRange = oRange.offset(1, 0, 1, 1); // смещаем указатель вниз } // копируем формат из предыдущей колонки var oRange1 =sheet.getRange(1,sLastcolumn-1,100,1) // получаем диапазон предыдущей колонки и ста записей рядов oRange1.copyFormatToRange(sheet,sLastcolumn,sLastcolumn,1,100);// копируем формат } // функция выбирает нужный профиль из GA(google analytics) function getProfile() { var accounts = Analytics.Management.Accounts.list(); if (accounts.getItems()) { var firstAccountId = accounts.getItems()[1].getId(); // выбираем нужный аккаунт из гугл аналитики ( номер "1" возможно надо будет изменить на "свой" )!!!!! //Logger.log(accounts.getItems()[1].getName()); // проверяем var webProperties = Analytics.Management.Webproperties.list(firstAccountId); if (webProperties.getItems()) { var firstWebPropertyId = webProperties.getItems()[10].getId();// получаем нужный профайл №10 ( номер профиля подобрал перебором ) ) !!!!!!! //Logger.log(webProperties.getItems()[10]);// проверяем профайл var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId); if (profiles.getItems()) { var Profile = profiles.getItems()[0]; return Profile; } else { throw new Error('No profiles found.'); } } else { throw new Error('No webproperties found.'); } } else { throw new Error('No accounts found.'); } } function getReportDataForProfile(firstProfile) { // функция обращается в Google Analytics по данным и получает данные за прошлый месяц var profileId = firstProfile.getId(); var tableId = 'ga:' + profileId; var sLastMonthRange = getLastMonth(1); // var optArgs = { /* 'dimensions': 'ga:keyword', // Comma separated list of dimensions. 'sort': '-ga:visits,ga:keyword', // Sort by visits descending, then keyword. 'segment': 'dynamic::ga:isMobile==Yes', // Process only mobile traffic. 'filters': 'ga:source==google', // Display only google traffic. 'start-index': '1', 'max-results': '250' // Display the first 250 results.*/ }; // Make a request to the API. var results = Analytics.Data.Ga.get( tableId, // Table id (format ga:xxxxxx). sLastMonthRange[0], // Start-date (format yyyy-MM-dd). sLastMonthRange[1], // End-date (format yyyy-MM-dd). 'ga:visits, ga:pageviews,ga:goalCompletionsAll', // Comma seperated list of metrics. ( https://developers.google.com/analytics/resources/articles/gdataCommonQueries) optArgs); if (results.getRows()) { return results; } else { throw new Error('No profiles found'); } } // функции дат function getLastNdays(nDaysAgo) { var today = new Date(); var before = new Date(); before.setDate(today.getDate() - nDaysAgo); return Utilities.formatDate(before, 'GMT', 'yyyy-MM-dd'); } function getLastMonth() { var sNow = new Date(); var dd = sNow.getDate(); var mm = sNow.getMonth(); var yyyy = sNow.getFullYear(); var sStart = new Date( yyyy, mm-1, 2, 0,0,1 ); var sDays = daysInMonth(yyyy, mm-1) ; var sEnd = new Date( yyyy, mm-1, sDays+1, 0,0,1 ); //Logger.log(sStart + " " + sEnd + ' -- ' + sDays); return [ Utilities.formatDate(sStart, 'GMT', 'yyyy-MM-dd') , Utilities.formatDate(sEnd, 'GMT', 'yyyy-MM-dd') ] ; } function daysInMonth(year, month) { return new Date(year, month, 0).getDate(); }
Места в которых необходимо внести изменения, я пометил комментами с паническим “!!!!!”.
Скрипт можно запускать руками раз в месяц. А можно и настроить крон для запуска автоматически “Меню -> Resourсe -> Manage Triggers”.
Запускаем функцию “setNewMetrics()”.
Надеюсь, это поможет кому-то автоматизировать получение метрик в Google Docs. На вопросы отвечаю ).
ссылка на оригинал статьи http://habrahabr.ru/post/170109/
Добавить комментарий