見出し画像

【GAS超実践】TwitterのAPIを叩いてチャネルの情報を自動取得する - ⑤スプレッドシートに書いたチャンネルIDをもとに自動でチャンネルの動画情報一覧を取得&書き込みする!

残り2

ゴールイメージ

さて、今回はいよいよ最終章です!今回ご紹介する「Youtubeの動画情報をスプレッドシートに自動更新する」という案件は、クラウドソーシング系やココナラなどのサービスで5000円〜50,000円でやり取りされてる美味しい案件です。


ゴールのイメージとしては、このように、自動取得したいチャンネルIDの一覧を記載したシートを用意して。

画像1

ここで実行すると、まずチャンネルの詳細な情報が自動で更新されます。(登録者や動画数・総視聴数が一発でわかるのは有益ですよね)

画像2


そして、画面下部を見るとわかりますが、1シート目に記載したチャンネル一覧のチャンネル名のシートを自動で作成して、動画一覧とその詳細(視聴回数や評価・コメント)を自動で取得して更新します。

画像3

ここまでをやっていきましょう!

はじめに

YoutubeAPIを使うには注意事項があります。
APIを利用する度に、クォータという単位を消費して、これが上限に達するとAPIを叩けなくなるのでご注意ください。
ちなみに、1日10,000回という上限があります。

「全然余裕じゃん??」

と思うかもしれませんが、以下を御覧ください。

・ チャンネル情報取得 : 1クォータ消費
・ チャンネルの動画一覧取得: 100クォータ消費
・ 動画詳細取得 : 1クォータ消費

チャンネルの動画一覧を取得するのに、1回100クォータも取得します。

さらに、このAPIはsearchメソッドというものを利用しますが、一回で取得できる動画の上限が50個という制限があります。

つまり、300個の動画を上げてるチャンネルの場合、(300/50 = 6回) => 600クォータ消費 となります。

つまり、これくらいの動画を上げてるチャンネルを10個くらい取得しようとすると、すぐ上限に行ってしまうので工夫が必要です。

動画情報を全て取得するために

先程、チャンネルの動画一覧を取得する場合、1回で50件まで。という制限があるとお伝えしました。
これを全ての動画分取得するには、【pageToken】というパラメータを使います。

例えば、160個の動画があるチャンネルの場合を考えてみましょう。

このように、50件ずつ取得する場合、APIは全部の件数が50件以上ある場合、nextPageTokenというパラメータを返します
僕たちは次のリクエストのときに、【pageToken】パラメータに前のレスポンスに入ってた【nextPageToken】を指定すると、欲しかった次の50件が取得できる訳です。

スクリーンショット 2020-08-02 23.31.49

今回はこの仕組を応用して、チャンネル内の全ての動画を取得するところまでやります。
(実務だとここまで求められる可能性が非常に高いため)

1. チャンネルID一覧のスプレッドシートを用意する

まずは、取得したいチャンネルIDが書かれているシートを用意しましょう。

このように、ヘッダー行には「チャンネルID」「チャンネル名」「登録者数」「公開日時」「投稿動画数」「総視聴回数」を予め入れておきます。

そしてA列に、今回取得したいチャンネルのIDを入れていきます。
(複数あっても動きますよ)

スクリーンショット 2020-08-02 17.50.44

2. データ取得対象のチャンネルID一覧を取得する

では、まずはこのシートから取得したいチャンネルID一覧を取得してみましょう。

お約束どおり、このシートから「ツール」→「スクリプトエディタ」でGASファイルを開いてください。

スクリーンショット 2020-08-02 23.36.44

開けたら、GASにこの「チャンネル情報」シートからチャンネルID一覧を取得する「getChannelIds」関数を用意します。

/**
* 取得対象のチャンネルID一覧を取得する
*/
function getChannelIds() {
 // チャンネル情報が記載されているsheetオブジェクトを取得
 let sheet      = spreadSheet.getSheetByName(channelInfoSheetName)
 let channelIds = sheet.getRange(2,1, sheet.getLastRow() -1 , 1).getValues()

 // getValuesの結果は二次元配列になっているので、1次元配列に変換して返す
 return [].concat(...channelIds)
}

おや、「spreadSheet」変数と「channelInfoSheetName」変数は、どこで宣言されてるのでしょうか?

実は、この後のことを考えて、spreadSheet変数(オブジェクト)とchannnelInfoSheetName(チャンネル情報という文字列)は、共通して使われるので、グローバル関数(関数の外で宣言)として用意してます。

/**
* 全体共通で利用する定数定義
*/

// ベースとなるYoutubeAPIのURL
const baseYoutubeAPIUrl = "https://www.googleapis.com/youtube/v3/"

// 前回取得したAPIキー
const key = "【あなたのAPIキー】"

// 共通で使うspreadSheetオブジェクト
const spreadSheet = SpreadsheetApp.getActive()

// チャンネル情報が書かれているシート名
const channelInfoSheetName = "チャンネル情報"

この4つは頻繁に使うので、グローバル変数として、GASコードの一番上に書いておいて下さい。

さて、試しにこの関数を実行してみましょう。
ちなみに、今回は大きく以下の4つの工程を行います。これらをまとめたmain関数を作り、その中で処理をしていきます。

A. チャンネル情報シートに記載のチャンネルID一覧のチャンネル情報をスプレッドシートに記載する
B. 対象のチャンネルで公開済みの動画ID一覧を取得
C. 対象チャンネルに投稿された動画一覧の詳細(動画名・視聴数・公開日・評価数・コメント数)を取得
D. Cで取得した情報を全て「チャンネル名」のシートに書き込む

ではまず、main関数にAの中のチャンネルID一覧を取得する処理を書いてみましょう。

function main() {
  let channelIds = getChannelIds()  // 取得対象のチャンネルID一覧を取得
  console.log(channelIds)
}

今のコードの全体像を一旦整理しましょう。こうなっているはずです。

/**
* 全体共通で利用する定数定義
*/

// ベースとなるYoutubeAPIのURL
const baseYoutubeAPIUrl = "https://www.googleapis.com/youtube/v3/"

// 前回取得したAPIキー
const key = "【あなたのAPIキー】"

// 共通で使うspreadSheetオブジェクト
const spreadSheet = SpreadsheetApp.getActive()

// チャンネル情報が書かれているシート名
const channelInfoSheetName = "チャンネル情報"


function main() {
 let channelIds = getChannelIds()  // 取得対象のチャンネルID一覧を取得
 console.log(channelIds)
}


/**
* 取得対象のチャンネルID一覧を取得する
*/
function getChannelIds() {
  // チャンネル情報が記載されているsheetオブジェクトを取得
  let sheet      = spreadSheet.getSheetByName(channelInfoSheetName)
  let channelIds = sheet.getRange(2,1, sheet.getLastRow() -1 , 1).getValues()

  // getValuesの結果は二次元配列になっているので、1次元配列に変換して返す
  return [].concat(...channelIds)
}

getChannelIds関数の解説

少しこの関数の中でやってることを解説しておきます。

ここはもう手慣れたものですね。シートの中身(チャンネルID一覧)を取得する(getRangeとgetValuesで)ために、sheetオブジェクトを取得してます。

  // チャンネル情報が記載されているsheetオブジェクトを取得
  let sheet      = spreadSheet.getSheetByName(channelInfoSheetName)

ここがよくわからない。という質問をDMでもらいますので図解で説明します。

  let channelIds = sheet.getRange(2,1, sheet.getLastRow() -1 , 1).getValues()

まず、getRangeは以下のような引数を取ります。

スクリーンショット 2020-08-03 00.08.08

今回のように、チャンネルIDの一覧(A2~A3)を取得したい場合、開始行数・開始列数は、A2セルとなるので、「sheet.getRange(2,1)」となりますね。

スクリーンショット 2020-08-03 00.09.25

さらに、このA2セルから始まって、今回はA3セルまで取得したいです。ここでややこしいのが、第三引数で「sheet.getLastRow() - 1」と、1を引いてる部分です。それは以下の図を見れば理由がわかります。

2行目から取得してるので、律儀にsheet.getLastRow() (今回は3)分だけ取得しちゃうと、空のセルまで食い込んじゃうので、防いでるだけですね。
ちなみに、仮にA3セルから始まってる場合は、「sheet.getLastRow() - 2」ですね。

スクリーンショット 2020-08-03 00.12.53

さて、これで実行してみましょう!!

main関数を実行しようとすると、「認証」を求められますので、いつもどおり自分のGoogleアカウントから、スプレッドシートへのアクセスを許可するように設定してください。

実行したら、「表示」→「ログ」をクリックしましょう。

スクリーンショット 2020-08-02 23.51.54

まだ何も表示されていないので、「Apps Scriptダッシュボード」をクリック!

画像8

ちゃんと取得対象の2チャンネル分のチャンネルIDが取得できているのがわかります。

スクリーンショット 2020-08-02 23.52.54

3. チャンネル情報を取得してスプレッドシートに書き込む

ではいよいよこのチャンネルIDを使って、チャンネルの詳細情報を取得して、書き込む処理を書いていきましょう。
channnelsメソッドを使ってチャンネル詳細を取得する方法は第二回で詳しく解説してるのでこちらを参照してください。

まず、main関数の中で、取得したチャンネルID全てに対して「チャンネル情報の取得」「動画IDの取得」「動画詳細の取得」「動画詳細の書き込み」をする必要があるので、チャンネルID分だけループを回します。

function main() {
  let channelIds = getChannelIds()  // 取得対象のチャンネルID一覧を取得

  for (i in channelIds) {
    // 各チャンネルIDごとの情報(チャンネル名や登録者数・投稿動画数・総視聴回数などをシートに追記する
    let targetSheet = writeChannelInfo(channelId, i)
  }
}

ここまではかんたんですね。ちなみに、writeChannelInfo関数の戻り値として、targetSheetという変数に値を入れてるのは、writeChannelInfoの中で「チャンネル名のシート」を作成してますが、最後にこのシートに【動画詳細の書き込み】を行うため、sheetオブジェクトを返してもらってます(後で理由はよくわかります)

ではwriteChannelInfo関数の中身を作っていきましょう。

ここから先は

19,480字 / 28画像

¥ 4,980 (数量限定:残り 2 / 5)

実践編で利用するための基礎編はすべて無料公開してます。 基礎編のモチベーション向上のためにサポートして頂けるとめちゃくちゃ喜びます!! だいたい作業工数は1記事あたり4-5時間程度かけて【分かりやすい】【知識が身につく!】を意識して作っておりますので、今後も頑張っていきます!