GoogleAppScript에서 Google 애널리틱스 방문수/PV 수 얻기 자동화

이 기사는 Speee Advent Calendar 2016의 7 일째 기사입니다.

전날 기사는
@iida-hayatoTestable Swift, 혹은 우리가 테스트를 쓰지 않는 이유 - Qiita

입니다.

이사의 @cultiva입니다.
평소의 일에서는 해외를 위한 서비스의 제품 매니지먼트를 하고 있습니다.

경위와 개요



우리 팀은 매주 월요일에 방문수와 PV를 보고합니다.
이를 위해 Google Analytics 화면에서 매번 수동으로 데이터를 다운로드하는 것이 번거롭기 때문에,
GoogleSpreadSheet와 GoogleAppScript를 사용하여 자동화했습니다.

사전 준비


  • GoogleSpreadsheet 스크립트 편집기 배포
    도구> 스크립트 편집기> 새 프로젝트 만들기
  • Google 애널리틱스의 협력 승인
    리소스 > GoogleAPI 사용에서 Google 애널리틱스 API 사용
    Google APIs Console에서 Google Analytics API를 [ON]으로 설정
    도구> 스크립트 갤러리> Google Analytics Data Fetch Functions를 설치하고 통합 승인
  • 뷰(프로파일) ID 확인
    "Analytics 관리 화면> Analytics 설정>보기 설정"에서 확인할 수있는 8 자리 숫자

  • GoogleAppScript 코드



    아래와 같이.
    (참고 URL을 조금 변경했을 뿐입니다만...)
    //スプレッドシート立ち上げ時に自動的に"処理メニュー"を追加
    function onOpen(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var menu = [
        {name: "週次処理", functionName: "runDemo"}
        ];
      ss.addMenu("処理メニュー", menu);
    }
    
    //GoogleAnalyticsからデータ取得
    
    function runDemo() {
      var profileId = 'secret';           //ビューID
      var tableId = 'ga:' + profileId;
      var startDate = getLastNdays(7);   // 1週間前(7日間)
      var endDate = getLastNdays(1);
    
      var optArgs = {
        'dimensions': 'ga:date',
      };
    
      var results = Analytics.Data.Ga.get(
          tableId,                  // Table id (format ga:xxxxxx).
          startDate,                // Start-date (format yyyy-MM-dd).
          endDate,                  // End-date (format yyyy-MM-dd).
          'ga:visits,ga:pageviews', // Comma seperated list of metrics.
          optArgs);
    
      outputToSpreadsheet(results);
    }
    
    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 outputToSpreadsheet(results) {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    
      // ヘッダー出力
      var headerNames = [];
      for (var i = 0, header; header = results.getColumnHeaders()[i]; ++i) {
        headerNames.push(header.getName());
      }
      sheet.getRange(1, 1, 1, headerNames.length)
          .setValues([headerNames]);
    
      // データの各行を出力
      sheet.getRange(2, 1, results.getRows().length, headerNames.length)
          .setValues(results.getRows());
    }
    

    트리거 설정



    이 설정으로 스프레드시트 시작 시
    위의 코드를 실행하고,
    최근 1주일의 데이터를 취득합니다.



    결과




    → 후에는 복사하여 다른 Excel 형식에 데이터를 붙여 넣으면 완성.

    기타



    트리거는 매주 월요일 아침에 시한 작동하는 구조로 해도 좋았습니다만,
    그렇다면 왜 잘 작동하지 않았기 때문에 그만두었습니다.
    (getActiveSpreadsheet()와 getActiveSheet()가 잘 작동하지 않기 때문에?)

    만약 시한동작이라고 해도, 데이터의 확인을 위해서 결국 spreadsheet를 한 번 열지 않으면 안 되므로,
    그렇다면 spreadsheet 시작시 프로그램을 실행하는 것이 좋다는 판단으로
    시작할 때 실행하도록 결정했습니다.

    참고 URL

    좋은 웹페이지 즐겨찾기