GASとspreadsheetを使ってYouTubeの再生回数レポートを自動更新する

GAS（Google Apps Script）とspreadsheetを使って、YouTubeの再生回数レポートを自動更新する仕組みについてまとめました。
ケースバイケースですが、少しでも参考になれば幸いです。

## YouTube Apiを利用する手順

Googleには、YouTubeを含む様々なApiが用意されています。
これらのApiを利用するにはトークンが必要です。

Googleのアカウント（hogehoge@gmail.com）を持っている方は、誰でもYouTube Apiを無料で利用できますが、GCP（Google Cloud Platform）アカウントを開設する必要があります。

★詳しくは下記リンク先を参考
[GCPアカウントの開設手順はコチラ >>](https://cloud.google.com/getting-started?hl=ja)


### プロジェクトを作成する

Google Apiのトークンを発行するには、プロジェクトが必要です。

プロジェクトの作成手順は以下の通りです。

* ヘッダーにある**「プロジェクト選択リスト」**をクリックし、表示される**「プロジェクト選択」**画面で**「新しいプロジェクト」**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/6662e5cf-0625-c04e-1e56-a28d9c31db0f.png)

* 任意のプロジェクト名を入力したら**「作成ボタン」**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/49c2f776-b4fd-d4aa-726f-892ff36322f1.png)

### プロジェクトにYouTube Apiのライブラリを追加する

* 作成したプロジェクトで、メニューから**「APIとサービス」＞「ライブラリ」**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/2304e201-a89f-a9db-c434-c9a86e46b6eb.png)

* 検索ボックスに**「YouTube」**と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/092c9df4-583e-30dd-4b2c-3ffaa121478d.png)

* 検索結果から**「YouTube Data API v3」**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/6cefdb2f-01dd-2f58-c8ee-ee00814a0bff.png)

* **「有効にする」**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/2aeb3804-e23b-61ad-8157-a029d7daf78a.png)



### Api用のトークンを発行する

* メニューから**「APIとサービス」＞「認証情報」**をクリックします。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/e40e43af-3b82-693c-83fe-88c3000ac35f.png)


* **「認証情報を作成」＞「APIキー」**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/5c70e152-454a-e8db-8212-4cca6c256c31.png)


* 発行されたら**「キーの制限」**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/35ab4cd8-a5f1-07cb-4ead-9d0561839f9d.png)

* **「名前」**に自分でわかるような値を入力し、**「キーを制限」**にチェックして先ほど追加した**「YouTube Data API v3」**のみをチェックして「保存」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/8fd1550a-83c0-7058-3e47-76f509167c5c.png)

キーの制限についてですが、個人利用なら別にしなくても良いです。
どうして制限するのかは、自分で考えましょう。

## Spreadsheetの準備

さて、APIは利用できる状態にしたのでspreadsheetで自動更新の仕組みを作っていきましょう。

今回利用するテンプレを共有します。
https://docs.google.com/spreadsheets/d/1xaiFj9Opr1AC1Hszc0-K7QbQvLn6RTY9O6HSBCsCi3Q/edit?usp=sharing

B列に再生回数を自動で取得したい動画リンクを貼り付けておきます。
C列はAPIで利用する際に動画IDを使うので、B列に貼り付けた動画リンクから動画IDのみを抽出する計算式を入れています。
タイトル、公開日、再生回数（D列、E列、F列）をAPIを使って自動更新します。

## GASで自動取得の仕組みを作る

いよいよラストです。
GASでspreadsheetにある動画IDのタイトル、公開日、再生回数をYouTube Apiで取得し、貼り付ける処理を実装していきます。

* spreadsheetのメニューから**「ツール」＞「スクリプト エディタ」**をクリックし、GASの編集画面を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/5297a43c-204c-f54b-7b0d-c398cf894750.png)

* Apps Script画面が表示されたら、スクリプトに「名前」を付けましょう。名前を付けたらコードを書く前に「サービス」を追加します。「サービス」右にある**「＋」マーク**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/f2328a62-d2b7-c427-92e3-8f08f5fd091d.png)

* リストの中から「YouTube Data API v3」を選択し**「追加」ボタン**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/5bd6d400-8c80-e3d0-3743-34cc17ec39a1.png)

* 次にコードに以下のコードを貼り付けます。

```
function getMovieDetails() {
  //更新対象のspreadsheetを定義
  var sID = "1xaiFj9Opr1AC1Hszc0-K7QbQvLn6RTY9O6HSBCsCi3Q"
  var ss = SpreadsheetApp.openById(sID)
  var sh = ss.getSheetByName('動画一覧')

  //B列の最終行取得
  var lastRow = sh.getRange(2, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();

  //C列の動画IDを配列で取得
  var arr = sh.getRange(2, 3, lastRow-1,1).getValues()
  //50個ずつに分割（APIでは一度50個しか照会出来ないため）
  var arrChunk = chunk(arr, 50)
  //貼付時の検索対象配列（非公開になった動画は結果が返却されないため、貼付時に動画IDを元に貼付先を検索するため）
  var searchTargetArr = rosToArray(sh, "C", lastRow)

  for(var j=0; j<arrChunk.length; j++) {
    movieList = arrChunk[j].join(',')
    result = getData(movieList)
    pasteResult(sh, result, searchTargetArr)

    //3秒のwaitを設定
    Utilities.sleep(3000)
  }
}

//動画のタイトル、公開日、再生回数を取得する
function getData(movieList) {
  API_KEY="発行したAPIキーをここに貼り付けましょう"
  
  var video = YouTube.Videos.list("snippet,statistics", {"id": movieList});
  video = JSON.parse(video)

  var rs = []
  for(var j=0; j<video.items.length; j++) {
    // [ID,タイトル,公開日,再生回数]の配列で格納する
    rs[j] = [ video.items[j].id, 
              video.items[j].snippet.title, 
              Utilities.formatDate(new Date(video.items[j].snippet.publishedAt), "JST", "yyyy-MM-dd HH:mm:ss"), 
              video.items[j].statistics.viewCount
            ] 
  }
  return rs
}

//貼付処理
function pasteResult(sh, result, searchTargetArr) {
  // IDが一致した横に再生数を貼り付ける
  for(var j=0; j<result.length; j++) {
    var key = result[j][0]
    var row = findRow(key, searchTargetArr)

    //先頭を除外した配列を貼り付ける
    
    var newRow = [[result[j][1],result[j][2],result[j][3]]]
    sh.getRange(row, 4, 1, newRow[0].length).setValues(newRow)

  }
}

//貼付対象の行数を返却する
function findRow(key, searchTargetArr){
 var row = searchTargetArr.indexOf(key) + 1;
 return row;
}

//指定したセル範囲を配列で返却する
function rosToArray(sh, col, lastRow) {
  var range = sh.getRange(col + "1:" + col + lastRow)
  var values = range.getValues();
  var array = [];
  for(var i = 0; i < values.length; i++){
    array.push(values[i][0]);
  }
  return array;
}

// 配列を指定数で分割する
function chunk(array, size) {
    const chunked = [];
    let index = 0;

    while (index < array.length) {
        chunked.push(array.slice(index, index + size));
        index += size;
    }

    return chunked;
}
```

* 貼り付けたら、getMovieDetails関数を実行することで詳細情報が更新されます。なお、初回起動時は権限周りの確認ダイアログが表示されます。許可しないと失敗しますので画面通り許可してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/43db033c-ee34-3196-fc84-f3ee1a57867f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/aaf4924b-2474-42f3-fe0b-d28da6e96513.png)

（この画面が表示されない方は飛ばしてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/d6b664de-1dcb-04d9-0c67-01f00c864feb.png)

（この画面が表示されない方は飛ばしてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/8da4582b-d747-228c-d62b-2273e7fdde6c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/962668/837399a5-bfe8-c2fc-e1ba-aa43c5e23863.png)


## 最後に

ここでは、基本系を説明しました。

工夫すれば、「とあるYouTuberの動画リストを自動取得して、それぞれのタイトル、公開日、再生回数を自動取得するレポート」などが作れます。
もしコツコツと手動で更新している方が居たら、チャレンジしてみてください。