ページ

2015年12月1日火曜日

Apps ScriptとQiita APIを利用してGoogleスプレットシートにデータを書き込む

Qiitaの情報を自分なりに見やすくしたいと思い
APIを利用しExcelのような形で見れるようにできないかと奮闘の備忘録

まずは準備
Qiita APIを利用すために個人用認証トークンを取得設定=>アプリケーション
から設定可能で今回は読み込みだけなので「read_qiita」で発行以後のソースにこちらの認証トークンを利用します。






続いてGoogle Drive上にファイルを作成2つのファイルを作成します。

まずは、Google Drive上でスプレットシートを作成
作成自体は簡単です。
続いて名前を付けて保存します。


ここでは、ファイル名「Qiita」シート名「lists」とします。
またA列にid,B列にtitle,C列にcreate date,D列にurl,E列にtagsを入れます。 


名称はなんでも良いですが見出しとして入れてください。
シート名はApps sciprtで利用しますので注意してください。



もう一つ必要なのがスプレットシートのIDです
IDはURLから取得できます。

パターンとしては
https://docs.google.com/spreadsheets/d/{ID}/edit#gid=0&vpid=A1
上記の{ID}部分がIDとなります。


例として以下となります。



青く塗られている部分がこのシートのIDになります。
※URLにアクセスしてもすでに削除済みなので開くことができません。





ようやく本題
apps scriptを利用していきます。

apps scriptが有効でない場合は以下の処理が必要です。


新規=>その他=>アプリを追加に行きます。
検索で「apps script」と検索すると以下がでます。

こちらを追加してください。
追加ができれば前の図様ように「Google Apps Script」が表示されます。
こちらを選択しApps Scriptを新規作成します。




コードは以下です。
コード実行時にアクセス許可をもめられうので許可して実行.
ファイル名:qiita

function myFunction() {
  // スプレッドシートのID.
  var spreadsheetId = '{ID}';
 // スプレッドシートのシート名.
  var spreadsheetName = 'list';
  // Qiita APIのURL.
  var url = 'https://qiita.com/api/v2/items?page=1&per_page=100';

  // スプレッドシートにアクセス.
  var spreadsheetData = SpreadsheetApp.openById(spreadsheetId);
  // スプレッドシートのシートにアクセス.
  var sheet = spreadsheetData.getSheetByName(spreadsheetName)
  // シートのデータを取得.
  var sheetdata = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn());
  // Qiita APIからデータを取得.
  var qiitas = getHttpQiitaApiRequest(url);
  
  // Qiita APIから取得したデータを列へ挿入.
  for (var n in qiitas) {
    var qitta = qiitas[n];
    var isCheck = findById(sheetdata, qitta.id);
    // 既に存在しているか確認.
    if (!isCheck) write(sheet, qitta);
    else break;
  }
  // ソートをcreate dateで降順にソート
  var sortRange = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn());
  sortRange.sort([{column: 3, ascending: false}, {column: 1, ascending: true}]);
}

/**
 * Qiita APIにアクセスしデータを取得します.
 */
function getHttpQiitaApiRequest(url) {
  // 認証トークンをセット
  var options =
      {
        'method' : 'get',
        'headers' : {
          'Authorization' : 'Bearer {認証トークン}'
        }
      };
  // HTTPリクエストを送信.
  var response = UrlFetchApp.fetch(url, options);
  // レスポンス結果を取得.
  var text = response.getContentText("UTF-8");
  // JSONパース.
  return JSON.parse(text);
}

/**
 * シートから重複するIDを検索します.
 * true: 既にIDが存在する場合. false: IDが存在しない場合.
 */
function findById(sheetdata, id) {
  for (var i in sheetdata) {
    // IDの重複チェック
    if (sheetdata[i][0] == id) return true;
  }
  return false;
}

/**
 * シートにデータを書き込みます. 
 */
function write(sheet, qitta) {
  // 最終行を取得.
  var n = sheet.getLastRow() + 1;
  // 日付の書式を変更
  var date = qitta.created_at.replace(/T/g, ' ').replace(/\+09:00/g, ' ');
  // データの書き込み
  sheet.getRange(n, 1).setValue(qitta.id);
  sheet.getRange(n, 2).setValue(qitta.title);
  sheet.getRange(n, 3).setValue(date);
  sheet.getRange(n, 4).setValue(qitta.url);
  var tag = "";
  for (var i in qitta.tags) {
    tag += qitta.tags[i].name + ",";
  }
  sheet.getRange(n, 5).setValue(tag);  
}

これを動かせば下図のような結果となります。



以上となります。
スケジューラーに組み込むと毎時更新とかが可能です。
Apps Scriptが思っている以上に色々できるので細々したの作成中です。