Автоматизация метрик для веб-сервиса с помощью GoogleDocs + Google Script

от автора

Меня зовут Чингис, я сооснователь веб-сервиса для командного решения задач Worksection.com

Мы у себя в сервисе отслеживаем ряд контрольных метрик. Посещения, регистрации, конверсии, активации, удержание, отток и тд. Метрики ведем в сводной таблице в Google Docs. Данные для метрик — собирались вручную из Google Analytics и из самого нашего сервиса. Потратив совсем немного времени, мы автоматизировали этот сбор.

За прототип сводной Excel таблицы брали финансовую модель Matthew Carroll для стартапов.

image

Данные в таблицу в 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *