【发布时间】:2021-07-02 00:41:55
【问题描述】:
我想在 Google 表格中列出某个 YouTube 频道的所有视频,并尽可能查看统计信息。如何使用 Google Apps 脚本实现这一点?
【问题讨论】:
标签: google-apps-script google-sheets youtube-data-api
我想在 Google 表格中列出某个 YouTube 频道的所有视频,并尽可能查看统计信息。如何使用 Google Apps 脚本实现这一点?
【问题讨论】:
标签: google-apps-script google-sheets youtube-data-api
以下代码的最终产物:
需要 YouTube 数据 API v3 凭据才能继续。见:
获得 API 密钥后,您就设置好了。这是策略:
uploads 的播放列表。找到该播放列表的 ID。 Channels.list 将用于此目的。请参阅Channels.list API here。PlaylistItems.list 获取此播放列表中每个视频的 ID 并将它们放入一个数组中。请参阅PlaylistItems.list API here。join() 将视频ID 连接成一个字符串,并将这个字符串传递给一个使用Videos.list 的函数。请参阅Videos.list API here。setFormula()。setFormula() 无法修改其他单元格的值。请查看更多信息here。以下是所有这些操作的方法:
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)
}
}
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');
}
}
【讨论】: