1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GAS編】QiitaAPIで投稿記事ごとのviews数、LGTM数、ストック数、コメント数を取得し一覧で表示

Last updated at Posted at 2022-06-24

以前投稿した「【JavaScript初心者】QiitaAPIで投稿記事ごとのviews数、LGTM数、ストック数、コメント数を取得し一覧で表示」のGoogleAppsScript(GAS)版です。
各投稿記事のviews数、LGTM数、ストック数等を一覧で確認できるようにします。QiitaAPI(api/v2/authenticated_user/items、api/v2/items/[記事のID])を使用して投稿記事ごとのviews数、LGTM数、ストック数を取得、表示しました。

本記事の環境

※PCに環境構築を行う必要はありません。
WEBブラウザ(Google Chome)
Googleアカウント

使用技術

GoogleAppsScriptのみ。

事前準備

以前の投稿の「事前準備」を参照してください。

使用方法

  • 以下の成果物をGoogleスプレッドシート/拡張機能/Apps Scriptにコピー&ペーストし、「ユーザーID」と「アクセストークン」を書き換える。
  • 「実行」ボタンを選択して、実行が終わるまで少し待つ。
    • 初回は、承認、Googleアカウントへのログイン、リクエストの許可が求められる。
  • 実行が終わったら実行ログを確認する。
  • 実行ログに問題がなければスプレッドシート側の出力結果を確認する。

成果物(画面)

09_結果確認3.png

所感

  • JavaScript版の成果物を参考にできたため以前よりスムーズに作成できた。
  • GAS版では、定期実行や、Qiita記事への自動投稿・更新も手軽に可能かと思われるため今後試してみる。

成果物(ソースコード)

// ユーザーID
const USER_ID = "[ユーザーID]";
// 閲覧権限トークン
const TOKEN = "[アクセストークン]";
// 見出し行
const TITLES = [
  "No","作成日","タイトル","views","LGTM","ストック","コメント",
];
// データ整形用
const COLUMNS = [
  "created_at", "title", "page_views_count", "likes_count", "stock_count", "comments_count",
];

// メイン処理
function qiitaMain() {
  // 処理対象スプレッドシートを取得する。
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheets()[0];

  // シート全体をクリアする。
  sheet.clear();

  // 見出し行を出力する。
  for (let indexY = 0; indexY < TITLES.length; indexY++) {
    sheet.getRange(1,indexY + 1).setValue(TITLES[indexY]);
  }

  // 記事一覧取得処理を呼び出す。
  let qiita_data = getQiita();
  // 記事一覧を出力する。
  for (let indexX = 0; indexX < qiita_data.length; indexX++) {
    // No列は個別に出力する。
    sheet.getRange(indexX + 2, 1).setValue(qiita_data.length - indexX);  
    for (let indexY = 0; indexY < TITLES.length; indexY++) {
      // 各記事を出力する。
      sheet.getRange(indexX + 2, indexY + 2).setValue(qiita_data[indexX][indexY]);  
    }
  }

  // 合計行を出力する。
  sheet.getRange(qiita_data.length + 3, 1).setValue("");
  sheet.getRange(qiita_data.length + 3, 2).setValue("");
  sheet.getRange(qiita_data.length + 3, 3).setValue("");
  sheet.getRange(qiita_data.length + 3, 4).setFormula("SUM(D2:D" + (qiita_data.length + 1) + ")");
  sheet.getRange(qiita_data.length + 3, 5).setFormula("SUM(E2:E" + (qiita_data.length + 1) + ")");
  sheet.getRange(qiita_data.length + 3, 6).setFormula("SUM(F2:F" + (qiita_data.length + 1) + ")");
  sheet.getRange(qiita_data.length + 3, 7).setFormula("SUM(G2:G" + (qiita_data.length + 1) + ")");

  // 実行日時を出力する。
  sheet.getRange(qiita_data.length + 5, 1).setValue("実行日時:" + Utilities.formatDate(new Date(),"JST", "yyyy/MM/dd HH:mm"));
}

// 記事一覧取得処理
function getQiita() {
  let result = [];
  let apiUrl = "https://qiita.com/api/v2/users/" + USER_ID + "/items";
  let response = UrlFetchApp.fetch(apiUrl);
  let total = response.getHeaders()['total-count'];
  let page = 1;
  let index_result = 0;
  while (index_result < total) {
    // ページャーごとに分けて記事を取得する。
    // 記事を全件取得するまで処理を続ける。
    let response = UrlFetchApp.fetch(apiUrl + "?page=" + page);
    let json = response.getContentText();
    let jsonData = JSON.parse(json);
    for (let index_json in jsonData) {
      // 取得した記事ごとに処理を行う。
      let work = [];
      // 記事詳細取得処理を呼び出す。
      let detail = getQiitaDetail(jsonData[index_json]['id']);
      // ストック数取得処理を呼び出す。
      let stock_count = getQiitaStock(jsonData[index_json]['id']);
      for(let column of COLUMNS) {
        switch (column){
          case "page_views_count":
            work.push(detail['page_views_count']);
            break;
          case "created_at":
            // 日付のフォーマットを変更する。
            work.push(Utilities.formatDate(new Date(jsonData[index_json][column]),"JST", "yyyy/MM/dd"));
            break;
          case "stock_count":
            work.push(stock_count);
            break;
          case "title":
            work.push('=HYPERLINK("' + jsonData[index_json]['url'] + '","' + jsonData[index_json][column] + '")');
            break;
          default:
            work.push(jsonData[index_json][column]);
            break;
        }
      }
      result[index_result] = work;
      index_result++;
    }
    page++;
  }
  // Logger.log(result);
  return result;
}

// 記事詳細取得処理(views数)
function getQiitaDetail(id) {
  let apiUrl = "https://qiita.com/api/v2/items";
  let headers = {'Authorization' : 'Bearer ' + TOKEN};
  let params = {'headers' : headers};
  let detail = UrlFetchApp.fetch(apiUrl + "/" + id, params);
  let jsonDetail = JSON.parse(detail.getContentText());
  return jsonDetail;
}

// ストック数取得処理
function getQiitaStock(id) {
  let result = 0;
  let apiUrl = "https://qiita.com/api/v2/items/" + id + "/stockers";
  let headers = {'Authorization' : 'Bearer ' + TOKEN};
  let params = {'headers' : headers};
  let page = 1;
  let flg = true;
  while (flg) {
    // ページャーごとに分けてストック情報を取得する。
    // ストック情報を全件取得するまで処理を続ける。
    let response = UrlFetchApp.fetch(apiUrl + "?page=" + page + "&per_page=100");
    let json = response.getContentText();
    let jsonData = JSON.parse(json);
    result += jsonData.length;
    if (jsonData.length < 100) {
      // 次のページャーがないと判断して処理終了。
      flg = false;
    }
    page++;
  }
  // Logger.log(result);
  return result;
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?