SANANEBLOG
GAS PR

YouTubeの検索ワードから関連動画情報をスプレッドシートに出力するツールの作成方法【GAS】

記事内に商品プロモーションを含む場合があります

はじめに

今回の記事ではGAS(Google Apps Script)を使用してYouTubeの動画情報を検索ワードから一括取得してスプレッドシートに出力するツールの作成方法を紹介します。

SANANE

GASを触ったことのない人でも作成できるように紹介します!

こんな人にオススメ

・YouTubeから動画の情報を取得して分析したい人

・GASとYouTube data APIを使って何かツールを作ってみたい人

動作イメージ

まず、今回作成したスプレッドシートに以下の情報を入力します。

A1セル:検索ワード(複数指定可能、間は半角スペース)

B1セル:取得したい動画件数

実行ボタンを押すと、検索ワードに基づいて関連度順で動画情報が一括表示されます。

今回出力するのは「タイトル」「チャンネル名」「概要」「再生回数」「いいね数」「コメント数」「コメントのサンプル3件」「動画URL」を出力しています。

事前準備

今回のツールを作成するにあたっては事前に以下のものが必要となります。

・YouTube data API

・Googleアカウント

YouTube data APIを取得する方法は以下リンクを参照ください。

作成したAPIキーを後のスクリプトに記載します。

発行したAPIキーの取り扱いには十分注意をしてください。

作成方法

スプレッドシートの作成

まずスプレッドシートにログインして、今回出力したいスプレッドシートを開きます。

スプレッドシートを開いたら、ブラウザのURLバーをクリックしてスプレッドシートのIDをコピーしておきます。コピーする部分は以下の場所です。

https://docs.google.com/spreadsheets/d/ここ値をコピーして控えておく/edit?pli=1#gid=0

スプレッドシートのIDを控えたら、スプレッドシートの上部バーから[拡張機能]>[Apps Script]をクリックします。別タブでApps Scriptが開きます。

GASの操作

最初から書かれている function myFunction() {} は消して以下のコードをコピペします。

function searchAndDisplayVideosInSpreadsheet() {
  var API_KEY = 'YOUR_YOUTUBE_API_KEY'; // Replace with your YouTube API Key
  var SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; // Replace with your Spreadsheet ID
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  
  var searchQuery = sheet.getRange("A1").getValue();
  var maxResults = sheet.getRange("B1").getValue();
  var baseUrl = 'https://www.googleapis.com/youtube/v3/search';
  
  var options = {
    key: API_KEY,
    part: 'snippet',
    q: searchQuery,
    type: 'video',
    maxResults: maxResults,
    order: 'relevance',
  };
  
  var query = '?key=' + options.key +
              '&part=' + options.part +
              '&q=' + options.q +
              '&type=' + options.type +
              '&maxResults=' + options.maxResults +
              '&order=' + options.order;
  
  var response = UrlFetchApp.fetch(baseUrl + query);
  var data = JSON.parse(response.getContentText());

  if (data.items.length > 0) {
    data.items.forEach(function(item, index) {
      var videoId = item.id.videoId;
      var videoResponse = UrlFetchApp.fetch('https://www.googleapis.com/youtube/v3/videos?key=' + API_KEY + '&id=' + videoId + '&part=statistics,snippet');
      var videoData = JSON.parse(videoResponse.getContentText());

      // Fetch the comments for the video
      var commentResponse = UrlFetchApp.fetch('https://www.googleapis.com/youtube/v3/commentThreads?key=' + API_KEY + '&videoId=' + videoId + '&part=snippet&maxResults=3');
      var commentData = JSON.parse(commentResponse.getContentText());
      
      var title = item.snippet.title;
      var channelTitle = item.snippet.channelTitle;
      var description = item.snippet.description; // Overview of the video
      var viewCount = videoData.items[0].statistics.viewCount;
      var likeCount = videoData.items[0].statistics.likeCount;
      var commentCount = videoData.items[0].statistics.commentCount;
      var comments = [];
      try {
        commentData.items.forEach(function(comment, commentIndex) {
          comments.push(comment.snippet.topLevelComment.snippet.textDisplay);
          sheet.getRange(index + 4, 7 + commentIndex).setValue(comment.snippet.topLevelComment.snippet.textDisplay); // Write each comment in a separate cell
        });
      } catch(e) {
        comments.push("No comments or not accessible");
      }
      var videoUrl = 'https://www.youtube.com/watch?v=' + videoId;
      
      sheet.getRange(index + 4, 1).setValue(title);
      sheet.getRange(index + 4, 2).setValue(channelTitle);
      sheet.getRange(index + 4, 3).setValue(description);
      sheet.getRange(index + 4, 4).setValue(viewCount);
      sheet.getRange(index + 4, 5).setValue(likeCount);
      sheet.getRange(index + 4, 6).setValue(commentCount);
      sheet.getRange(index + 4, 10).setValue(videoUrl);
    });

    sheet.getRange(3, 1).setValue("タイトル");
    sheet.getRange(3, 2).setValue("チャンネル名");
    sheet.getRange(3, 3).setValue("概要");
    sheet.getRange(3, 4).setValue("再生回数");
    sheet.getRange(3, 5).setValue("いいね数");
    sheet.getRange(3, 6).setValue("コメント数");
    sheet.getRange(3, 7).setValue("コメント1");
    sheet.getRange(3, 8).setValue("コメント2");
    sheet.getRange(3, 9).setValue("コメント3");
    sheet.getRange(3, 10).setValue("動画URL");

  } else {
    Logger.log('No videos found.');
  }
}

続けて、2行目と3行目に記載されている下記2つを書き換えてください。

YOUR_YOUTUBE_API_KEY→事前準備で取得したYouTube APIキー

YOUR_SPREADSHEET_ID→控えておいたスプレッドシートID

[Ctrl + S]か上部バーの[プロジェクトを保存]を押してコードを保存します。

実行

まずスプレッドシートのタブに移動します。

A1セルに検索ワードを入力します。複数ワード検索も可能ですが、間のスペースは半角で入力してください。

B1セルには出力件数を半角数字で入力します。多すぎると1日のAPI呼び出し上限を超えてしまう場合があるため適度な件数を入力してください。

入力したら再度Apps Scriptのタブに移動します。

[▶実行]をクリックします。最初の関数の実行には権限が必要となるため、

[承認が必要です]というモーダルが表示されたら、[権限を確認]>[表示されているGoogleアカウント]>[詳細]>[無題のプロジェクト(安全ではないページ)に移動]>[許可]まで移動します。クリック後GASが実行されます。

ボタンの作成

再度スプレッドシートのタブに戻ります。

Google スプレッドシートを開き、上部メニューの [挿入] > [図形] をクリックします。

好きな図形を選択し、スプレッドシート上の任意の位置に挿入します。この図形がボタンとなります。

ボタン(図形)を右上の…をクリックし、[スクリプトを割り当て] をクリックします。

開いたダイアログボックスに 以下を入力し[確定]をクリックします。

searchAndDisplayVideosInSpreadsheet

以降は作成されたボタンを右クリックすることで、簡単にGASを実行することができます。

GASおすすめ本

GASをもっと勉強したい!ほかにも自分で何か作成したい!という方には以下がおすすめです。

参考

コメントを3件取得するとAPIの一日の利用上限をすぐに使い切ってしまう恐れがあるため、コメントを取得しないバージョンのスクリプトを参考として記載します。

function searchAndDisplayVideosInSpreadsheet() {
  var API_KEY = 'YOUR_YOUTUBE_API_KEY'; // Replace with your YouTube API Key
  var SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; // Replace with your Spreadsheet ID
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  
  var searchQuery = sheet.getRange("A1").getValue();
  var maxResults = sheet.getRange("B1").getValue();
  var baseUrl = 'https://www.googleapis.com/youtube/v3/search';
  
  var options = {
    key: API_KEY,
    part: 'snippet',
    q: searchQuery,
    type: 'video',
    maxResults: maxResults,
    order: 'relevance',
  };
  
  var query = '?key=' + options.key +
              '&part=' + options.part +
              '&q=' + options.q +
              '&type=' + options.type +
              '&maxResults=' + options.maxResults +
              '&order=' + options.order;
  
  var response = UrlFetchApp.fetch(baseUrl + query);
  var data = JSON.parse(response.getContentText());

  if (data.items.length > 0) {
    data.items.forEach(function(item, index) {
      var videoId = item.id.videoId;
      var videoResponse = UrlFetchApp.fetch('https://www.googleapis.com/youtube/v3/videos?key=' + API_KEY + '&id=' + videoId + '&part=statistics,snippet');
      var videoData = JSON.parse(videoResponse.getContentText());

      var title = item.snippet.title;
      var channelTitle = item.snippet.channelTitle;
      var description = item.snippet.description; // Overview of the video
      var viewCount = videoData.items[0].statistics.viewCount;
      var likeCount = videoData.items[0].statistics.likeCount;
      var commentCount = videoData.items[0].statistics.commentCount;
      var videoUrl = 'https://www.youtube.com/watch?v=' + videoId;
      
      sheet.getRange(index + 4, 1).setValue(title);
      sheet.getRange(index + 4, 2).setValue(channelTitle);
      sheet.getRange(index + 4, 3).setValue(description);
      sheet.getRange(index + 4, 4).setValue(viewCount);
      sheet.getRange(index + 4, 5).setValue(likeCount);
      sheet.getRange(index + 4, 6).setValue(commentCount);
      sheet.getRange(index + 4, 7).setValue(videoUrl);
    });

    sheet.getRange(3, 1).setValue("タイトル");
    sheet.getRange(3, 2).setValue("チャンネル名");
    sheet.getRange(3, 3).setValue("概要");
    sheet.getRange(3, 4).setValue("再生回数");
    sheet.getRange(3, 5).setValue("いいね数");
    sheet.getRange(3, 6).setValue("コメント数");
    sheet.getRange(3, 7).setValue("動画URL");

  } else {
    Logger.log('No videos found.');
  }
}