📹

GASのYouTube Data APIを使って動画の再生数を取得する

2022/05/29に公開5

実現すること

  • GASの Youtube Data API v3 を利用し、個別動画の情報を取得する
  • 取得する情報は以下
    • タイトル
    • 再生数
    • いいね数
    • コメント数
    • 投稿日時
    • 概要
  • 情報取得するタイミングは、特定カラムに個別動画のURLが入力されたとき

Youtube Data API v3 を利用する

  • 前準備としてGASを使い始めるといった部分については省く
  • 今回はスプレッドシートでの利用と限定されていること、広く頒布する必要のないことからコンテナバインド型で記述している

  • 「サービス」を選択

  • Youtube Data API v3 を選択
    -

動画URLから情報を取得する

function getVideoData(url) {
  // URLからビデオIDを取得
  const splitedUrlArray = url.split('?v=')
  const videoId = splitedUrlArray[splitedUrlArray.length - 1]

  // APIを叩いて情報を取得
  const results = YouTube.Videos.list('snippet,statistics', { id: videoId });
  const { items } = results
  const { statistics, snippet } = items[0]
  const { title, publishedAt, description } = snippet
  const { viewCount, likeCount, commentCount } = statistics
  return { title, publishedAt, description, viewCount, likeCount, commentCount }
}
  • YouTube でAPIが利用可能
  • 今回は個別動画の情報を取得したいので Videos リソースを利用
  • APIリファレンスから、今回取得したい内容が入っているプロパティをチェック
  • 該当プロパティの値を抜き出して返却する関数とする

セルが更新されたら値を取得する

  • スプレッドシートのB列にURLを入力し、C列以降に取得した情報を自動反映させる
  • まずは更新されたセルを取得する内容
function getActiveCell() {
  const sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
  const activeCell = sheet.getActiveCell(); //アクティブセルを取得

  if (activeCell.getColumn() !== 2) { //アクティブセルがB列かを判定
    Logger.log('column is B')
    return
  }
}
  • これを発展させて、更新されたセルの入力値を受け取り、動画情報を取得する
function updateVideoInfo() {
  const sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
  const activeCell = sheet.getActiveCell(); //アクティブセルを取得
  const activeRow = activeCell.getRow(); // アクティブな行を取得

  if (activeCell.getColumn() !== 2) { //アクティブセルがB列かを判定
    return
  }

  // 情報取得
  const {
    title,
    publishedAt,
    description,
    viewCount,
    likeCount,
    commentCount
  } = getVideoData(activeCell.getValue())

  // 値を反映
  sheet.getRange(activeRow, 3).setValue(title);
  sheet.getRange(activeRow, 4).setValue(viewCount);
  sheet.getRange(activeRow, 5).setValue(likeCount);
  sheet.getRange(activeRow, 6).setValue(commentCount);
  sheet.getRange(activeRow, 7).setValue(publishedAt);
  sheet.getRange(activeRow, 8).setValue(description);
}

function getVideoData(url) {
  ...
}

イベント実行のトリガーに指定して完成

  • トリガーを作成する

  • 実行する関数 = 作った関数

  • イベントのソース = スプレッドシート

  • イベントの種類 = 変更時

  • 上記でイベントを作成

スプレッドシートでURLを入力してみる

  • 完成

Discussion

ちゃーりーちゃーりー

はじめまして、GAS初心者です。記事を参考にYoutubeから情報をスプシに収集していきたいと思い、この記事に辿り着きました。質問よろしいでしょうか?

「動画URLから情報を取得する」のところで、コピぺして使おうとしたところ「TypeError: Cannot read property 'split' of undefined」とでて、うまく作動しません。いろいろと調べてみましたが、初心者には難しく…どうかこのエラーの解消法を教えていただけると嬉しいです。

よろしくお願いいたします。

sungvalleysungvalley

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split

こちらにある通り split() は文字列を分割するメソッドです。
TypeError: Cannot read property 'split' of undefined
このエラーが出るということは、引数に文字列が入っておらず undefined になっているのではないでしょうか?
動作確認のためのデバッグなら以下のようにして、変数に値を入れてやればいいと思います。
トリガーを設定済なら url = '調べたい動画のURL'console.log(url) にしてログから値が入っているか見てみたらどうでしょう。

function getVideoData(url) {
  // ここを追加
  url = '調べたい動画のURL'
  // URLからビデオIDを取得
  const splitedUrlArray = url.split('?v=')
  const videoId = splitedUrlArray[splitedUrlArray.length - 1]
.
.
.
}
スカイパンダスカイパンダ

はじめまして、GAS初心者です。動画URLが複数あり、一番上のURLは表示できたのですがその下からは表示されないのですが、何が問題かわかりません。ご教示頂けると幸いです

sungvalleysungvalley

詳細がわからないので多分に予測が含まれますが、一度にリストを貼り付けていませんか?
1つのセルが変更されたらそこに対してイベントが走るコードになっています。
B列に1つ1つURLをコピペしていったら動くような気がします。

ドーナッツドーナッツ

はじめまして、こちらの記事を参考にさせていただきました!
動作確認させていただいたところ、イベント実行のトリガーに指定する関数が、サンプル画像にあるgetVideoDataではなくupdateVideoInfoにしないと動作しなかったので、念のためご報告させていただきます。