「GASって何？」だった僕が、Google Analyticsの情報をChatWorkにポストするbotを作るまでにやったこと


Google App Script Advent Calendar 15日目担当の[@ikemonn](https://twitter.com/ikemonn)です。
GASなんて聞いたことが無かった僕が「Google Analyticsの情報をChatWorkにポストするbot」を作るまでにやったことを書こうと思います。

##作ったもの
1週間でPVが多かったページTop10の情報(PV,滞在時間、直帰率)を、GASと[ChatWork API](http://blog-ja.chatwork.com/2013/11/api-preview.html)を使って毎週特定の時間になると自動的にポストするbot


![スクリーンショット 2013-12-15 6.24.07.png](https://qiita-image-store.s3.amazonaws.com/0/18573/93646a2e-1dfe-f248-4d60-e7e4896a3201.png "スクリーンショット 2013-12-15 6.24.07.png")



##作るまでにやったこと
1. ドットインストールの[GAS講座#1〜#11](http://dotinstall.com/lessons/basic_google_apps_script)を見る
2. ドットインストールで解説されているサンプルコードを書いてみる
3. ChatWork 技術部の渋谷さんが書かれた[チャットワークAPI を Google Apps Script で使ってみた](http://c-note.chatwork.com/post/69590585422/chatworkapi-gas-library)を読む
4. [Web屋に朗報！Google Analyticsとスプレッドシート＆Excelでサイト分析を自動化する方法](http://www.find-job.net/startup/ga_spreadsheet_auto)に書いてあるソースを動かしてみる
5. [GASの公式ドキュメント](https://developers.google.com/apps-script/)を読みながら上記のソースを修正する

1〜5までで合計4.5h(毎日1.5h×3日間)で作れました。
JavaScriptに慣れている方ならもっと早く作れるようになるのではと思います。

##作り方

#### GASとGoogle Analyticsを連携させる
+ スクリプトエディタの「リソース＞GoogleAPIを使用」からGoogle Analytics APIを有効に

![スクリーンショット 2013-12-15 6.56.12.png](https://qiita-image-store.s3.amazonaws.com/0/18573/683d6f46-42ae-01ca-b799-ba503e586341.png "スクリーンショット 2013-12-15 6.56.12.png")

+ Google Analytics APIをONにする

![スクリーンショット 2013-12-15 6.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/18573/8e445eb9-40c9-eb2e-a853-580869689bb4.png "スクリーンショット 2013-12-15 6.56.40.png")

+ OKを押した後、上記画像の下の方にある「[Google APIs Console](https://code.google.com/apis/console/)」に行き、Google Analytics APIをONにする

![スクリーンショット 2013-12-15 6.57.01.png](https://qiita-image-store.s3.amazonaws.com/0/18573/75b52caf-1b14-7720-f0b4-a8d188edf386.png "スクリーンショット 2013-12-15 6.57.01.png")




+ GASでChatWork APIを使うためのライブラリを読み込む設定をする

+ 以下のコードをコピペ

```
function postCW() {
  try {
    var startDate = getLastNdays(7);
    var endDate   = getLastNdays(0);
    
    var header = "【" + startDate + "〜" + endDate + "のPVが多いページランキング】" + "\n\n"; 
    var data   = "";
    
    var firstProfile = getFirstProfile();
    var results      = getReportDataForProfile(firstProfile, startDate, endDate);
    
    //ChatWork出力用にデータを整形
    for(var i in results.getRows()) {
      data += results.getRows()[i][0] + "\n" 
            + "閲覧数: " + results.getRows()[i][1] + "PV\n" 
            + "滞在時間: " + Math.round(results.getRows()[i][2]) + "秒\n" 
            + "直帰率: " + Math.round(results.getRows()[i][3]) + "%\n" 
            + "----------------------" + "\n";
    }
    
  sendChatWork(header + data);

  } catch(error) {
    Browser.msgBox(error.message);
  }
}


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 getFirstProfile() {
  var accounts = Analytics.Management.Accounts.list();
  if (accounts.getItems()) {
    //GoogleAnalyticsで複数のブログの計測をしている方は[1]の数字を変更する
    var firstAccountId = accounts.getItems()[1].getId();

    var webProperties = Analytics.Management.Webproperties.list(firstAccountId);
    if (webProperties.getItems()) {

      var firstWebPropertyId = webProperties.getItems()[0].getId();
      var profiles = Analytics.Management.Profiles.list(firstAccountId, firstWebPropertyId);

      if (profiles.getItems()) {
        var firstProfile = profiles.getItems()[0];
        return firstProfile;

      } else {
        throw new Error('No views (profiles) found.');
      }
    } else {
      throw new Error('No webproperties found.');
    }
  } else {
    throw new Error('No accounts found.');
  }
}


function getReportDataForProfile(firstProfile, startDate, endDate) {

  var profileId = firstProfile.getId();
  var tableId = 'ga:' + profileId;
  var resultCount = 10;
  var optArgs = {
    'dimensions': 'ga:pageTitle',   //ページタイトルごとに結果を取得
    'sort': '-ga:pageviews',        //PV数でソート 
    'max-results': resultCount      //出力データの件数
  };

  var results = Analytics.Data.Ga.get(
      tableId,
      startDate,
      endDate,
      'ga:pageviews,ga:avgTimeOnPage,ga:visitBounceRate',  //PV,滞在時間、直帰率を取得
      optArgs);
  
  if (!results.getRows()) {
    throw new Error('No views (profiles) found');
  }  
  
  return results;
}


function sendChatWork(msg){
  var cw = ChatWorkClient.factory({token: 'ChatWork APIのトークン'});
  cw.sendMessage({room_id: 'ルームID', body: msg});
}


```

+ 上記コードを特定時間にポストするように設定する

時計マークをクリック
![スクリーンショット 2013-12-15 7.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/18573/f4b6bba8-b03c-f1cf-db58-00bec826aae3.png "スクリーンショット 2013-12-15 7.32.40.png")



自動でポストしたい時間を選択
![スクリーンショット 2013-12-15 7.33.06.png](https://qiita-image-store.s3.amazonaws.com/0/18573/d5f151ed-84e3-fe5b-479f-a565198282b4.png "スクリーンショット 2013-12-15 7.33.06.png")

 
##おまけ
こんなのも作ってみました。
[【GAS】Google Apps ScriptとChatWork APIを利用してスクレイピングしたものをポストする](http://ikemonn.hatenablog.com/entry/2013/12/15/074455)


##参考
+ [ドットインストール](http://dotinstall.com/lessons/basic_google_apps_script)
+ [作業効率化！Googleアプリを1000%活かせる「Google Apps Script」の始め方 | 株式会社LIG] ( http://liginc.co.jp/web/tool/app/53038 )

+ [Web屋に朗報！Google Analyticsとスプレッドシート＆Excelでサイト分析を自動化する方法 | Find Job ! Startup] ( http://www.find-job.net/startup/ga_spreadsheet_auto )

+ [[GAS]ライブラリを作成するには : 逆引きGoogle Apps Script ]( http://www.bmoo.net/archives/2012/07/314396.html )

+ [チャットワークAPI を Google Apps Script で使ってみた] ( http://c-note.chatwork.com/post/69590585422/chatworkapi-gas-library )