如何使用 Google Apps 脚本将有关频道所有视频的信息获取到 Google 表格

How to get information about all videos of a channel to Google Sheets with Google Apps Script

我想在 Google 表格中列出 YouTube 频道的所有视频,并在可能的情况下查看统计信息。如何使用 Google Apps 脚本实现此目的?

以下代码的最终产品:

  • 将频道 ID 作为输入
  • Returns 由 YouTube 数据 API 提供的统计信息进入活动 sheet

YouTube 数据 API 需要 v3 凭据才能继续。参见:

获得 API 键后,您就设置好了。这是策略:

  1. YouTube 上的每个频道都有一个名为 uploads 的播放列表。找到该播放列表的 ID。 Channels.list 将用于此。请参阅 Channels.list API here
  2. 使用 PlaylistItems.list 获取此播放列表中每个视频的 ID,并将它们放入一个数组中。请参阅 PlaylistItems.list API here
  3. 使用 join() 将视频 ID 连接成一个字符串,并将该字符串传递给一个使用 Videos.list 的函数。请参阅 Videos.list API here
  4. 实施 UI 元素以连续列出所有视频。
    • 这是必要的,因为 YouTube 数据 API 每页提供 50 个结果。
    • 要每 50 行调用一个新的 API 调用,应使用 setFormula()
    • 从脚本调用时,setFormula() 无法修改其他单元格的值。请查看更多信息

以下是执行所有这些操作的方法:

  1. 创建一个新的 Google Apps 脚本项目。 (工具 > 脚本编辑器)
  2. 将以下代码粘贴到您的脚本文件中。
var API_KEY='YOUR_API_KEY'
var CHANNELS_URL = 'https://www.googleapis.com/youtube/v3/channels'
var PLAYLIST_ITEMS_URL = 'https://youtube.googleapis.com/youtube/v3/playlistItems'
var VIDEOS_URL =  'https://youtube.googleapis.com/youtube/v3/videos'

/** 
 * @param {string} ID of the channel
 * @return {string} ID of the playlist that contains all video uploads
 */
function GET_UPLOADS_PLAYLIST_ID(channel_id){
  url_uploads_id = CHANNELS_URL + "?part=contentDetails&id=" + channel_id + "&key=" + API_KEY;
  return ImportJSON(url_uploads_id, "/items/contentDetails/relatedPlaylists/uploads", "noHeaders")
}

/** 
 * @param {string} ID of a playlist
 * @return {string} URL to be used in the API call
 */
function GET_VIDEO_INFO(playlist_id){
  items_url = PLAYLIST_ITEMS_URL + "?part=contentDetails&maxResults=50&playlistId=" + playlist_id + "&key=" + API_KEY;
  return items_url;
}

/** 
 * @param {string} ID of a playlist
 * @return {array} Two dimensional array that contains all video IDs and total page number
 * 
 * See pagination here: https://developers.google.com/youtube/v3/guides/implementation/pagination
 */
function GET_ALL_VIDEOS_IDS_AS_ARRAY(channel_id){
  var uploads_id = GET_UPLOADS_PLAYLIST_ID(channel_id)
  var video_ids = []
  var page_count = 0
  var next_page_token = ""
  api_url = GET_VIDEO_INFO(uploads_id) + "&pageToken=" + next_page_token
  while (1){
    page_count += 1
    video_ids.push(ImportJSON(api_url, "/items/contentDetails/videoId", "noHeaders"))
    next_page_token = ImportJSON(api_url, "/nextPageToken", "noHeaders")
    api_url = GET_VIDEO_INFO(uploads_id) + "&pageToken=" + next_page_token
    if(ImportJSON(api_url, "/nextPageToken", "noHeaders").length == 0){
      page_count += 1
      video_ids.push(ImportJSON(api_url, "/items/contentDetails/videoId", "noHeaders"))
      break
    } 
  }
  return [video_ids, page_count]
}

/**
 * @param {string} ID of a channel
 * Fetches statistics to the active sheet
 */
function  MULTIPLE_IDS_TO_STATS(channel_id){
  var row = 'A'
  var array = GET_ALL_VIDEOS_IDS_AS_ARRAY(channel_id)
  var page_number = array[1]

  for (var i = 0; i < page_number; i++){
    var col = i*51 + 1
    var cell = row + col
    var video_ids = array[0][i].join()
    var api_url = VIDEOS_URL + "?part=snippet,statistics" + "&fields=items(id,snippet(title,description,tags),statistics)" +"&id=" + video_ids + "&key=" + API_KEY;
    if (col>2){
      formula = '=ImportJSON("' + api_url + '" , "", "noHeaders") '
    } else {
      formula = '=ImportJSON("' + api_url + '" , "", "") '
    }
    SpreadsheetApp.getActiveSheet().getRange(cell).setFormula(formula)
  }
  
}
  1. 单击“文件”旁边的加号图标并选择“脚本”。将您的新脚本文件重命名为“ImportJSON”和 paste this code.
  2. 单击“文件”旁边的加号图标并选择“脚本”。将新脚本文件重命名为“menu”并粘贴以下代码。这是为了创建必要的 UI 元素。
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('VIDEO LISTER')
      .addItem('LIST VIDEOS', 'videoLister')
      .addToUi();
}

function videoLister() {
  var ui = SpreadsheetApp.getUi(); // Same variations.

  var result = ui.prompt(
      'Enter the channel ID',
      ui.ButtonSet.OK_CANCEL);

  // Process the user's response.
  var button = result.getSelectedButton();
  var text = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
    MULTIPLE_IDS_TO_STATS(text)
  } else if (button == ui.Button.CANCEL) {
    // User clicked "Cancel".
    ui.alert('I didn\'t get any channel ID');
  } 
}
  1. 保存文件并刷新 Spreadsheet 文件。您应该会在顶部栏中看到一个名为“VIDEO LISTER”的新菜单项。提供频道 ID,让脚本完成工作。