Google Apps ScriptからQiita APIを使って、Qiita:Teamのユーザーの投稿などを取得する

Qiita:Teamのさまざまな統計情報などをQiita APIを使って得ることが出来ます。

前回は[Google Apps ScriptからQiita APIを使って、Qiita:Teamの情報を得る方法（ユーザー一覧の入手）](http://qiita.com/takoratta/items/4a0f3a5f9bb75c0646dc) でQiita APIをGAS (Google Apps Script) から利用する手順と簡単な例としてユーザー一覧を取得しました。

今回は、ユーザーの投稿や投稿数を取得する方法を解説します。

## Qiita APIの利用

Qiita APIを利用するための、アクセストークンの取得やGASでの設定などは、[前回の投稿](http://qiita.com/takoratta/items/4a0f3a5f9bb75c0646dc#%E8%AA%8D%E8%A8%BC)をご覧ください。今回も[そこ](http://qiita.com/takoratta/items/4a0f3a5f9bb75c0646dc#gas%E3%81%8B%E3%82%89%E3%81%AE%E5%88%A9%E7%94%A8)で解説した```qiitaAPI()```を利用します。

## ユーザーの投稿の取得

ユーザーの投稿数は```/api/v2/items```(https://qiita.com/api/v2/docs#get-apiv2items) で取得できます。

自分のチームのURL (https経由) の```/api/v2/items```にGETアクセスすることで投稿一覧は得られます。パラメータを付けないと、該当のQiita:Teamの全ユーザーによる全投稿が得られますが、検索クエリを指定することでユーザーや投稿日などで絞り込むことも出来ます。

検索クエリはQiita:Teamで利用できる検索オプションが使えます。以下のようなオプションがあります。

| 項目 | オプション |
|:--|:--|
|タイトルに「2015」を含んでいる   |title:2015   |
|「Ruby」タグが付いている   |tag:Ruby   |
|yaottiが作成した  |user:yaotti  |
|2015-10-09以降に作成された|created:>2015-10-09|
	
利用可能なすべての検索オプションは[ヘルプ](http://help.qiita.com/ja/articles/qiita-search-options)に記載されています。

ここではユーザーごとの投稿を取得するため、```user:```検索オプションを用います。また、投稿日で絞り込みも行うため、```created:```オプションも指定します。

次の```getItems()```では、ユーザーID (id) と投稿日の開始日 (startDate)、終了日 (endDate) で絞り込んで、その結果の投稿を取得しています。

```getItems('yaotti', '2016-06-01', '2016-06-15')```のように利用することを想定しています。これにより、ユーザーyaottiの2016年6月1日から2016年6月15日までの投稿が取得できます。

```js
function getItems(id, startDate, endDate){
  /* ページネーションの設定として、1ページごと要素数は100、取得する要素は1ページ目のものとしています。 */
  var per_page = 100;
  var page = 1;
  var parameters = '?per_page=' + per_page + '&page=' + page;

  /* 検索クエリとして、IDと投稿日で絞り込みます。 */
  var queryString = 'user:' + id + '+created:>' + startDate + '+created:<' + endDate;
  
  queryString = 'query=' + encodeURI(queryString); // URLエンコーディング
  parameters += '&' + queryString; // ページネーションと合わせてパラメータを生成
  
  var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + '?' + queryString, 'GET', '');
  var json = response.getContentText();
  var data = JSON.parse(json);
  
  var items = [];

  /* 最初のページの要素を取得 */
  for (i = 0; i < data.length; i++) {
    var item ={'id':data[i].id, 'created_at': data[i].created_at, 'userid': data[i].user.id}; // 例として、ID（投稿のID）と投稿日、ユーザーIDを取得しています
    items.push(item);
  }

  /* 総要素数を取得 */
  var headers = response.getHeaders();
  var total_count = headers['Total-Count'];

  /* 要素すべてを取得するために、2ページ目以降にアクセス */
  for (page = 2; total_count / per_page >= 1; page++) {
    var parameters = '?per_page=' + per_page + '&page=' + page + queryString;
    var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + '?' + queryString, 'GET', '');
    var json = response.getContentText();
    var data = JSON.parse(json);
    var items = [];
  
    for (i = 0; i < data.length; i++) {
      var item ={'id':data[i].id, 'created_at': data[i].created_at, 'userid': data[i].user.id}; // ID（投稿のID）と投稿日、ユーザーIDを取得
      items.push(item);
    }
    total_count = total_count - per_page;
  }

  return items;
}

```

ここでは、例として、投稿IDと投稿日、ユーザーIDを取得していますが、その他にも[/API/v2/itemsの解説](https://qiita.com/api/v2/docs#get-apiv2items)にあるようなプロパティを取得できます。

## ユーザーの投稿数の取得

単にユーザーの投稿数だけを取得したい場合には、APIにGETアクセスし得られる```Total-Count```を取得します。

```js
function getNumOfItemsPerId(id, startDate, endDate) {
  /* Total-Countを得られれば良いだけなので、ページネーションの設定として、1ページごと要素数は1、取得する要素は1ページ目のものとしています。 */
  var per_page = 1;
  var page = 1;
  var parameters = '?per_page=' + per_page + '&page=' + page;

  /* 検索クエリとして、IDと投稿日で絞り込みます。 */
  var queryString = 'user:' + id + '+created:>' + startDate + '+created:<' + endDate;
  
  queryString = 'query=' + encodeURI(queryString); // URLエンコーディング
  parameters += '&' + queryString; // ページネーションと合わせてパラメータを生成

  var response = qiitaAPI('https://チーム名.qiita.com/api/v2/items' + parameters, 'GET', '');

  var headers = response.getHeaders();
  return headers['Total-Count'];
  
}
```

この```getNumOfItemsPerId()```を各ユーザーに対して呼び出すことで、ユーザーの期間ごとの投稿数などを把握できます。スプレッドシートで統計を取ったり、前の週の投稿数トップ10を週明けにSlackのチャンネルに投げるなどの応用ができます。