【スプレッドシート】YouTubeAPIで動画の再生数を自動取得を50件以上できるようにする

業務効率化
スポンサーリンク

以前、『YouTube動画の再生数をスプレッドシートで取得する』という記事で、YouTube APIを使用してスプレッドシートに再生数を反映させる方法を書きました。

しかし前回の方法ではAPIの仕様上、50件以上の動画の再生数を取得する際は途中で停止してしまう現象があります。

今回はその50件以上の動画の再生数を取得する方法を書いていきます。

当記事をご覧いただく前に、下記の2点の記事を読み基盤を作っていただくとスムーズに作成可能です。

YouTube動画の再生数をスプレッドシートで自動取得して業務効率アップ!
スプレッドシートでYouTubeの情報を引っ張りたくて調べてみたら、AppsScriptを使用することが判明しました。 ちょっと難しいそうでしたが、しっかりやり方を見ればできましたので備忘録として書いてみます。 ※スプレッドシートに関しては...
【YouTube API】APIキーの取得方法(Google Deveroper Console)
スプレッドシートでYouTubeの情報を引っ張りたくて調べてみたら、YouTubeのAPIキーが必要と書いてあったので取得しました。 備忘録として取得方法書いていきます。 YouTube APIキーの取得方法 (1)Google Dever...

YouTube動画の再生数を取得するスクリプトを書く

(1)スプレッドシートの上メニューで 拡張機能 > Apps Script をクリック。

(2)(1)をクリックすると下記のようなページが開けます。ここに、スクリプトを書きこみます。

(3)下記のスクリプトを書きこみます。

※行:横一列
※列:縦一列

  • 1行目のfunction getMovieViews(clearFlg) {…}の『getMovieViews』はスクリプトの名称になるのでわかりやすい名称にしてください
  • 8行目のgetSheetByName(‘DB’);の『DB』はシート名です。対象のシート名を入力してください。
  • 19行目のsheet.getRange(row, 5)はYouTubeIDの取得箇所です。今回はE列から取得するので『sheet.getRange(row, 5)』となります。※A列なら『sheet.getRange(row, 1)』、B列なら『sheet.getRange(row, 2)』のようにする
  • 23行目のsheet.getRange(row, 6)は19行目のIDに対して再生数の入力列です。F列からに書き込むので『sheet.getRange(row, 6)』となります。
  • 34行目の『start_row = 2;』は、取得開始行が何行目か指定可能です。3行目からの場合は『start_row = 3;』、4行目からの場合は『start_row = 4;』としてください。
  • 63行目、『sheet.getRange(start_row, 5, 50)』は動画IDが記入されたセルを取得します。今回はE列から取得するため『sheet.getRange(start_row, 5, 50)』としてます。※A列なら『sheet.getRange(start_row, 1, 50)』、B列なら『sheet.getRange(start_row, 2, 50)』のようにする
  • 65行目、『sheet.getRange(start_row, 5, finish_row – start_row)』は動画IDが記入されたセルを取得します。今回はE列から取得するため『(start_row, 5, finish_row – start_row)』としてます。
  • 73行目の『取得したAPIキー』にあなたの取得したAPIキーに差し替えてください。
  • 87行目、93行目、98行目の『 sheet.getRange(start_row + row, 6)』は書き込む列を指定しています。今回はF列に書き込むため『 sheet.getRange(start_row + row, 6)』としてます。※A列なら『 sheet.getRange(start_row + row, 1)』、B列なら『 sheet.getRange(start_row + row, 2)』のようにする
function getMovieViews(clearFlg) {

  //開始時間を取得 
  var startTime = new Date();

  //sheetオブジェクト作成
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('DB');


  //実行完了しなかった場合に設定するトリガー名 
  var triggerKey = "trigger";

  //入力されている行数を取得 
  var start_row = ""
  var finish_row = ""
  for (var row = 1; row < 10000; row++) { 
    //ID列がNULLの場合、最終行として取得 
    if (sheet.getRange(row, 5).isBlank() && finish_row == "") {
      finish_row = row 
    } 
    //再生回数列がNULLの場合、開始行として取得 
    if (sheet.getRange(row, 6).isBlank() && start_row == "") {
      start_row = row 
    }
    //どちらも取得済みの場合にForを抜ける
    if (finish_row !== "" && start_row !== "") {
      break
    }
  } 
  //開始行&ループ回数取得
  if (typeof clearFlg == "undefined") {
    //開始行の設定
    start_row = 2;
    //ループする回数を取得
    var loop = (finish_row - 2) / 50;
    var loop_chk = (finish_row - 2) % 50;
    //割り切れていない場合はループ回数に1を加算

    if (loop_chk != 0) {
      var loop = Math.floor(loop) + 1;
    } 
  } else {
    //開始行>= 終了行の場合はトリガー削除して終了
    if (start_row >= finish_row) {
      deleteTrigger(triggerKey);
      return
    }
    //ループする回数のみ取得
    var loop = (finish_row - start_row) / 50;
    var loop_chk = (finish_row - start_row) % 50;
    //割り切れていない場合はループ回数に1を加算
    if (loop_chk != 0) {
      var loop = Math.floor(loop) + 1;
    }
  }

  //ループ回数分、再生回数取得とシート入力する。
  for (var i = 1; i <= loop; i++) {

    //動画IDが記入されたセルのrangeオブジェクトを作成
    if (i < loop) {
      var range_id = sheet.getRange(start_row, 5, 50)
    } else {
      var range_id = sheet.getRange(start_row, 5, finish_row - start_row)
    }
    //作成したrangeオブジェクトから動画IDを配列で作成する
    var values = [];
    var values = range_id.getValues();
    //YouTube APIに送信するクエリを作成する
    var qury_array = values.map(id => "&id=" + id)
    var qury = qury_array.join("")
    var json_url = "https://youtube.googleapis.com/youtube/v3/videos?part=statistics" + qury + "&key=取得したAPIキー";

    //YouTube APIからデータを受診する
    var json = UrlFetchApp.fetch(json_url).getContentText();
    var jsonData = JSON.parse(json);

    //結果をセルに記入する  
    var jsonRow = 0;
    values.length
    for (let row = 0; row < values.length; row++) {
      if (jsonRow < jsonData.items.length) {
        if (values[row] == jsonData.items[jsonRow]['id']) {
           //対象のIDで再生回数が取得できたらセット
           Logger.log(jsonData.items[jsonRow]['statistics']['viewCount']);
           sheet.getRange(start_row + row, 6).setValue(jsonData.items[jsonRow]['statistics']['viewCount']);
           //再生回数
           jsonRow = jsonRow + 1;
        } else {
           //対象のIDで再生回数が取得できなかったら0をセット
           Logger.log(0);
           sheet.getRange(start_row + row, 6).setValue(0); //再生回数
        }
     } else {
       //以降も0をセット
       Logger.log(0);
       sheet.getRange(start_row + row, 6).setValue(0);
     }
    } 

    //範囲を変更
    start_row = start_row + 50;
    //時間の判定
    let diff = parseInt((new Date() - startTime) / (1000 * 60));
    if (diff >= 5) {
      //トリガー(1分後)を登録する
      setTrigger(triggerKey, "TrrigerJob");
      return
    }
  }
}

(4)実行結果が、ページ下のログに表示され、『実行完了』が表示され、スプレッドシートに再生数が表示されれば完了です。

おわりに

と、いうことで『YouTube動画の再生数をスプレッドシートで取得する』でした。

スプレッドシートには他にもたくさんの便利機能があるので、紹介していきたいと思います。

今回は、リクエスト記事です!リクエストありがとうございます。