見出し画像

【GAS】YouTubeチャンネルの動画リストを書き出す

概要

YouTubeチャンネル内の動画リストをgoogleスプレッドシートのアクティブシートに書き出すGASのコードです。

動画の公開時系列順に、公開日付、タイトル、動画URL、サムネイルURLを取得します。

関数の切り分けや例外処理でもっと強固に&スマートにできますが、「コピペすればとりあえず動くための基本的な仕組み」を並べた状態です。

APIキーの取得と設定

まず、APIキーを取得し、コード内の「ここにAPIキーを入力」の部分に入力します。APIキーは安全なように制限をかけておきます。

【APIキーの取得について参考にさせていただいたサイト】
https://qiita.com/iroiro_bot/items/1016a6a439dfb8d21eca

(※1)キーやトークンなどの秘密にしなければならない情報は、本来はプロパティストアに格納しておいて呼び出す方が安全ですが、ここではひとまずそれを使わず、一気にコピペすれば動く仕様で書いています。
ご自身で使用する際は、これを土台に、秘密情報はプロパティストアに格納するように書き換えてください。

【プロパティストアについて参考になるサイト】
https://tonari-it.com/gas-property-store/

チャンネルIDの取得

次に、取得したいチャンネルのチャンネルIDを見つけます。大規模なチャンネルでなければ、そのチャンネルのURLの末尾の「UC~~~~~~」がチャンネルIDです。

コード実行による動画リストの取得

ここで取得しているのは、動画の公開時系列順に、公開日付、タイトル、動画URL、サムネイルURLです。

こうした情報がスプレッドシートに取れれば、glideアプリなどで、自分のYouTubeチャンネルを使いやすく提供することもできそうですね。

fetchしたレスポンスオブジェクト内で抽出したい情報については、下記のリファレンスなどで何という名前のプロパティに格納されているのかを確認した後、実際にレスポンスをログ出力して構造を確認しながら抽出コードを書いています。
https://developers.google.com/youtube/v3/docs/channels/list?hl=en

/* 
 * 指定のチャンネルID内の動画リストを取得してアクティブシートに書き出す関数
 * API取得参考URL:https://developers.google.com/youtube/v3/getting-started
 */
function fetchVideoDateTitleUrlInYTChannel() {

  const youtubeApiKey = 'ここにAPIキーを入力'; //できれば本来はプロパティストアに格納
  const channelId = 'ここにチャンネルIDを入力' //URLの末尾から分かる

  const options = {
     "muteHttpExceptions": true, //エラーの詳細が省略されず出力されるようにtrueに設定
  }


  let nextPageToken = ""; //ページ切り替え用トークンの初期化
  const dateTitleUrlThumbnailArr = []; //取得した情報を格納していく配列

  try {
    while (nextPageToken !== undefined) {
      const url = `https://www.googleapis.com/youtube/v3/search?key=${youtubeApiKey}&channelId=${channelId}&part=snippet,id&order=date&maxResults=50&pageToken=${nextPageToken}`;

      const response = UrlFetchApp.fetch(url, options);
      const text = response.getContentText();
      const obj = JSON.parse(text);

      nextPageToken = obj.nextPageToken;

      const itemsArr = obj.items;

      itemsArr.forEach(item => {
        const date = item.snippet.publishedAt.split('T')[0];
        const videoTitleOriginal = item.snippet.title;
        const regEx = /("|&)/g     //タイトルに"や&が入っていれば空文字に置換
        const videoTitle = videoTitleOriginal.replace(regEx, '');
        const videoUrl = `http://www.youtube.com/watch?v=${item.id.videoId}`;
        const thumbnailUrl = item.snippet.thumbnails.default.url;

        dateTitleUrlThumbnailArr.push([date, videoTitle, videoUrl, thumbnailUrl])
      });

    }
  } catch (e) {
    console.log('Error:')
    console.log(e);
  }

  //アクティブシートに書き込み
  const sheet = SpreadsheetApp.getActiveSheet();
  const dateRange = sheet.getRange('A:A');
  dateRange.setNumberFormat("yyyy/MM/dd");

  const targetRange = sheet.getRange(2, 1, dateTitleUrlThumbnailArr.length, dateTitleUrlThumbnailArr[0].length);
  targetRange.setValues(dateTitleUrlThumbnailArr);

}

※チャンネルに50以上の動画がある場合、nextPageTokenを付したurlで新たにリクエストを繰り返し、すべての動画を取得する仕組みです。

※const optionsのmuteHttpExceptions": trueを含む3行は、エラーがあった場合に詳細を解析できるように設定していますが、なくても動きます。

ですので、もしこの3行を削除する場合は、

const response = UrlFetchApp.fetch(url, options);

を、以下に変更してください。

const response = UrlFetchApp.fetch(url);

この記事が気に入ったらサポートをしてみませんか?