新人エンジニアがやってみた！GASでQiita記事のいいね数を毎日取得する方法



## はじめに
こんにちは、新人エンジニアのchaloです。今回は、Google Apps Script (GAS) を使って、自分がこれから作成するQiita記事のいいね数の傾向を毎日取得する方法をご紹介します。これは、Qiita APIを活用してデータを取得し、Googleスプレッドシートに自動的に記録するシンプルなアプリです。



## 準備
### スプレッドシートの拡張機能でGASを作製
スプレッドシートの「拡張機能」から「App Script」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3647606/ea61d8b7-2fbf-396b-e118-2524a5e3e429.png)
### Qiitaのアクセストークンを取得
アカウントから「設定」を選択して「アプリケーション」からアクセストークンを作製する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3647606/64edf9be-5189-e40f-5e55-8a85dc1a31f5.png)

いいね数を獲得するだけなら「read」権限だけでOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3647606/08a33c72-650c-a09b-5701-cc61dc614196.png)

ここで取得できたアクセストークンを保存しておく。
※トークンはここでしか表示されないので、控えておく

## GASの実装
GASを以下のように実装する
※アクセストークンは準備の時に控えていたトークンを張り付ける
```
function updateQiitaLikes() {
  // Qiita APIのエンドポイントとアクセストークンを設定
  const apiEndpoint = 'https://qiita.com/api/v2/items/';
  const accessToken = 'XXXXXXXXXXXXXXXXXXXXX'; // ここにQiitaのアクセストークンを入力
  
  // スプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  
  // 日付を記載するための列を決定
  const date = new Date();
  const columnToWrite = findNextAvailableColumn(sheet, 1);
  
  // 日付をB列の1行目に記載
  sheet.getRange(1, columnToWrite).setValue(date);
  
  // A列のURLをループで処理
  for (let i = 1; i < data.length; i++) {
    const url = data[i][0];
    const articleId = extractArticleId(url);
    if (!articleId) {
      Logger.log('Invalid URL at row ' + (i + 1));
      continue;
    }
    
    // Qiita APIリクエスト用のオプションを設定
    const options = {
      'method': 'get',
      'headers': {
        'Authorization': 'Bearer ' + accessToken
      }
    };
    
    try {
      // APIリクエストを送信
      const response = UrlFetchApp.fetch(apiEndpoint + articleId, options);
      const data = JSON.parse(response.getContentText());
      
      // いいね数を取得
      const likesCount = data.likes_count;
      
      // 日付の下にいいね数を記載
      sheet.getRange(i + 1, columnToWrite).setValue(likesCount);
      
      Logger.log('Row ' + (i + 1) + ': Likes ' + likesCount);
    } catch (error) {
      Logger.log('Error fetching data for row ' + (i + 1) + ': ' + error.message);
    }
    // 1秒の遅延を追加
    Utilities.sleep(1000);
  }
}

function extractArticleId(url) {
  const regex = /https:\/\/qiita\.com\/.*\/items\/([a-f0-9]{20})/;
  const matches = url.match(regex);
  return matches ? matches[1] : null;
}

function findNextAvailableColumn(sheet, row) {
  const columns = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
  for (let i = 0; i < columns.length; i++) {
    if (!columns[i]) {
      return i + 1;
    }
  }
  return columns.length + 1;
}

// 実行用関数
function testUpdateQiitaLikes() {
  updateQiitaLikes();
}

```
上記の実装でスプレッドシートのA列に記載されたURLのいいね数を取得できる。
※APIやサービスへのリクエスト数には注意
## 実行結果
いいね数を取得したURLは、執筆時のトレンド上位の記事を取得させてもらいましたorz
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3647606/31b48de8-e3c5-c357-9cdc-a0fbcdc3d43b.png)

## 毎日実行するように設定
毎日実行するために、GASのトリガーから毎日0~1時に実行するように設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3647606/077a3193-39d2-c0b1-01a2-05be108442f1.png)

## GASを使うメリット
このプロジェクトはAWS LambdaやGCPのCloud Functionでも実装可能ですが、それにはいくつかの注意点があります。

- AWS LambdaやGCPのCloud Functionの無料枠
    - これらのサービスは無料枠内で実装可能ですが、無料枠を超えると課金が発生します
- AWSやGCPのアカウント登録
    - AWSやGCPを利用するには、アカウント登録とクレジットカード情報の登録が必須です
- GASの利点
    - GASは、Googleアカウントを持っていれば誰でも利用可能で、完全に無料です。特に小規模なプロジェクトでは、簡単に始められるという大きなメリットがあります

## まとめ
これで、毎日指定した時間に指定したURLのQiita記事のいいね数が自動的に記録されるようになります。データを分析することで、記事の人気度の変化を追跡することができます。

皆さんもぜひ試してみてください！