GASでQiita APIを叩いて結果をGoogleスプレッドシートに自動入力する手順を詳しくメモしておく

[同僚](https://qiita.com/s__tnk0513)が楽しそうに書いているのを見ていて、前々から触ってみたかった**GAS**。

そんな折、今期はアウトプット強化が課題となったので、 **自分の書いたQiitaのLGTM数を集計するスクリプトをGASで作ってみました。**

ただ、割とつまづく箇所も多かったので、自分のための備忘録として、なるべく詳しい手順をQiitaに残しておきたいと思います。

## 1. Googleスプレッドシートを作成して、スクリプトエディタに移動する

まず、[Googleスプレッドシート](https://docs.google.com/spreadsheets/)を作成します。

今回作成するスプレッドシートのカラムは、`No.`、`投稿者`、`LGTM`、`タイトル`、`URL`、`投稿日` とします。

![Screen Shot 2020-08-20 at 11.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/177f2f87-2a12-b3d7-1998-5dea7557ed47.png)

スクリプトエディタに移動します。（複数のGoolgeアカウントでログインしているとアクセスエラーが出る場合があるので、その場合は一旦全部ログアウトしてから再度ログインすると移動できます。）

![Screen Shot 2020-08-20 at 11.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/4aeb4345-4cd3-4a45-269b-c9e5396f6150.png)

## 2. メソッドを追加する

スクリプトエディタにあるコードは一旦全て消して、`fetch_qiita_articles` という名前のメソッドを追加します。

```js
function fetch_qiita_articles() {

}
```

## 3. GASでAPIを叩く

Qiitaの記事情報を取得したいので、[Qiita API](https://qiita.com/api/v2/docs)の[/v2/users/:user_id/items](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)というユーザの記事一覧データを取得できるエンドポイントを叩きます。

以下のように書くことでレスポンスを得られます。（Qiitaのユーザ名は書き換えてください。）

```js
const response = UrlFetchApp.fetch("https://qiita.com/api/v2/users/Qiitaのユーザ名/items")
```

## 4. GASでJSONレスポンスをパースする

[/v2/users/:user_id/items](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)は、JSONを返すので以下のようにパースしましょう。

```js
const json = JSON.parse(response)
```

[/v2/users/:user_id/items](https://qiita.com/api/v2/docs#get-apiv2usersuser_iditems)は、記事一覧の情報を配列で返すのでforEachで回して、記事名、URL、LGTM数、投稿日時を取得します。[※補足](#補足)

そして、各項目をスプレッドシートのカラム順に並べた配列を作りましょう。

```js
json.forEach((json, index) => {
    const article = [index + 1, json["user"]["id"], json["likes_count"], json["title"], json["url"], json["created_at"]]
})
```

## 5. GASでスプレッドシートに結果を書き込む
後は、先ほど作った配列を、[appendRow(rowContents)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#appendrowrowcontents)を使ってスプレッドシートの行の最後に追加するだけです。[※補足](#補足)

```js
const sheet = SpreadsheetApp.openById("GoogleスプレッドシートのID").getSheetByName("Googleスプレッドシートのシート名")
sheet.appendRow(article)
```

では実行してみましょう。

![Screen_Shot_2020-08-20_at_12_06_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/70ad688e-47e3-ff50-3fed-8c33aa4869ee.png)

無事スプレッドシートに書き込まれてますね！

![Screen_Shot_2020-08-20_at_12_10_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/15719e85-6605-6442-6bc3-21134bc8c9e9.png)

### 補足
- わかりやすくするため、forEachと[appendRow(rowContents)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#appendrowrowcontents) を例にしていますが、これだと1行1行書き込むことになるので行数が増えると遅くなってしまいます。なので、mapで配列に収めて `getRange(row, column, numRows, numColumns).setValues()` で一度に書き込むのが[おすすめ](https://github.com/kurarararara/gas_samples/blob/master/fetch_qiita_articles.gs)です。
- スプレッドシートのIDは、スプレッドシートのURLのこの部分になります。
  - https://docs.google.com/spreadsheets/d/この部分/edit#gid=0
- シート名は、スプレッドシートの左下にあるタブ名となります。

## 6. Cronのように時間指定して定期実行する

ちなみに、GASは時間指定の実行も簡単に行えます。

まず、スクリプトエディタのメニューバーにある時計ボタンをクリックします。

![Screen_Shot_2020-08-20_at_12_11_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/a2872a12-8a4d-04f2-ea7d-046345ef4f36.png)

トリガー追加ボタンをクリックします。

![Screen_Shot_2020-08-20_at_12_12_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/b7ceb9d0-f42e-dbd3-b717-def8536a245d.png)

各項目を設定します。自分は毎朝9〜10時に実行したいので以下のように設定しました。設定が完了したら保存ボタンを押します。

![Screen Shot 2020-08-20 at 12.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/7930aa3a-157c-eca3-c1f0-7e8242998cf0.png)

時間になればスプレッドシートに結果が自動で書き込まれるはずです。

![Screen Shot 2020-08-20 at 12.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/b08991ab-d266-fd14-4582-18aac87c0eca.png)

## 7. コード全文

全文も載せておきます。

```js
function fetch_qiita_articles() {
    const sheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName("シート名")
    const response = UrlFetchApp.fetch("https://qiita.com/api/v2/users/Qiitaのユーザ名/items")
    const json = JSON.parse(response)
    json.forEach((json, index) => {
        const article = [index + 1, json["user"]["id"], json["likes_count"], json["title"], json["url"], json["created_at"]]
        sheet.appendRow(article)
    })
}
```

## 8. 実際に使っているコード

ちなみに現在、実際に使っているのは、このコードになります。

fetch_qiita_articles.gs
[https://github.com/kurarararara/gas_samples/blob/master/fetch_qiita_articles.gs](https://github.com/kurarararara/gas_samples/blob/master/fetch_qiita_articles.gs)

**開発チームメンバーのQiita記事情報を一度に取得できたり、期間を指定できたり、記事数が多くなっても書き込みが遅くならないようにしていたり** と若干機能を加えていますのでよかったら試してみてください。

## 9. 最後に

いやーGAS楽しいですね。ちょっとのコードで大いに楽できるツールが作れそうで非常に気に入りました。

もう少しなんか作ってみたいと思います。

こんな記事も書いています。

[GoogleスプレッドシートとFastlaneでApp Store説明文を自動更新する方法](https://zenn.dev/kurarararara/articles/6d198bc9337edf)