ReferenceError:未定义 YouTube/将 YouTube 评论插入电子表格

Posted

技术标签:

【中文标题】ReferenceError:未定义 YouTube/将 YouTube 评论插入电子表格【英文标题】:ReferenceError: YouTube is not defined / insert YouTube comments to a Spreadsheet 【发布时间】:2021-03-09 23:59:51 【问题描述】:

我正在尝试将 YouTube cmets 插入电子表格。

我想从中获取 cmets 的 YouTube 视频是由我在同一个 Google 帐户上创建的。 YouTube 数据 API v3 已启用。当我运行该函数时,出现错误:

ReferenceError: YouTube is not defined (line 9, file "Code"),

但这对我来说似乎很好。我不知道第 9 行出了什么问题。

这是完整的代码:

function getComments() 

var ss = SpreadsheetApp.getActiveSpreadsheet();
var video_list = ['YouTube_ID'];
var PageToken = '';

for (var i = 0; i < video_list.length; i++) 
  var video_id  = video_list[i];
  var video = YouTube.Videos.list('id, snippet, statistics', id: video_id,);
  
  if (i == 0) 
    var sh = ss.getActiveSheet();
   else 
    var sh = ss.insertSheet();
  
  sh.setName(video.items[0].snippet.title);
  
  var row = 2;
  var col = 1;
  sh.getRange(1, 1).setValue("name");
  sh.getRange(1, 2).setValue("date");
  sh.getRange(1, 3).setValue("comment");

      
  while (true) 
    var comment_list = YouTube.CommentThreads.list('id, replies, snippet', 
      videoId: video_id,
      pageToken: PageToken,
      maxResults: 500,
    );
  
    for (var j = 0; j < comment_list.items.length; j++) 
      sh.getRange(row, col).setValue(comment_list.items[j].snippet.topLevelComment.snippet.authorDisplayName);
      sh.getRange(row, col + 1).setValue(comment_list.items[j].snippet.topLevelComment.snippet.publishedAt);
      sh.getRange(row, col + 2).setValue(comment_list.items[j].snippet.topLevelComment.snippet.textDisplay);
      row += 1;
      if (typeof comment_list.items[j].replies !== "undefined") 
         for (var k = 0; k < comment_list.items[j].replies.comments.length; k++) 
           sh.getRange(row, col).setValue(comment_list.items[j].replies.comments[k].snippet.authorDisplayName);
           sh.getRange(row, col + 1).setValue(comment_list.items[j].replies.comments[k].snippet.publishedAt);
           sh.getRange(row, col + 2).setValue(comment_list.items[j].replies.comments[k].snippet.textDisplay);
           row += 1;
         
       
    
    PageToken = comment_list.nextPageToken
    if (typeof PageToken == "undefined") 
      break
    
  

错误信息如下:

【问题讨论】:

从您的脚本和错误消息中,您能否确认 YouTube Data API v3 是否已在 Google 高级服务中再次启用? Ref如果还没有启用,请启用它并再次测试您的脚本。 错误刚刚解决,函数运行没有任何问题。我在this page 上启用了 YouTube Data API v3,但这是错误的。非常感谢您的帮助^^ 感谢您的回复。从您的回复中,我可以理解您的错误信息可以被删除。我很高兴。作为一个建议,我建议使用修改后的脚本来降低脚本的处理成本作为答案。你能确认一下吗?如果这对您的情况有用,我很高兴。 【参考方案1】:

修改点:

根据您的脚本和错误消息,我认为您的错误消息YouTube is not defined 的原因是由于在高级 Google 服务中禁用了 YouTube Data API v3。关于这个,您能否再次确认一下是否已经在 Google 高级服务中启用了 YouTube Data API v3? Ref如果还没有启用,请启用它并再次测试您的脚本。

而且,当我看到你的脚本时,我认为脚本的处理成本会很高。因为循环中使用了setValue。 Ref为了减少你的脚本的处理成本,我建议如下流程。

    检索所有值并将它们放入数组中。 将数组放入电子表格。

“视频:列表”方法的maxResults似乎是50。

当以上几点反映到你的脚本中时,它变成如下。

修改脚本:

function getComments() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var video_list = ['YouTube_ID'];
  var PageToken = '';
  var values = []; // Added
  for (var i = 0; i < video_list.length; i++) 
    var video_id  = video_list[i];
    var video = YouTube.Videos.list('id, snippet, statistics', id: video_id);
    if (i == 0) 
      var sh = ss.getActiveSheet();
     else 
      var sh = ss.insertSheet();
    
    sh.setName(video.items[0].snippet.title);
    values.push(["name", "date", "comment"]); // Added
    while (true) 
      var comment_list = YouTube.CommentThreads.list('id, replies, snippet', videoId: video_id, pageToken: PageToken, maxResults: 50);
      for (var j = 0; j < comment_list.items.length; j++) 
        var snippet = comment_list.items[j].snippet.topLevelComment.snippet;
        values.push([snippet.authorDisplayName, snippet.publishedAt, snippet.textDisplay]); // Added
        var replies = comment_list.items[j].replies;
        if (replies) 
          for (var k = 0; k < replies.comments.length; k++) 
            var comments = replies.comments[k].snippet;
            values.push([comments.authorDisplayName, comments.publishedAt, comments.textDisplay]); // Added
          
        
      
      PageToken = comment_list.nextPageToken;
      if (typeof PageToken == "undefined") 
        break
      
    
    sh.getRange(1, 1, values.length, values[0].length).setValues(values); // Added
  

注意:

在此脚本中,当存在相同的工作表名称时,会发生错误。所以请注意这一点。

参考资料:

Videos: list google-apps-script 我认为这些链接可能有用。

【讨论】:

以上是关于ReferenceError:未定义 YouTube/将 YouTube 评论插入电子表格的主要内容,如果未能解决你的问题,请参考以下文章

打字稿 - 未捕获的 ReferenceError:未定义导出

ReferenceError: $ 未定义

ReferenceError:未定义 DartObject

ReferenceError:未定义解析

JavaScript Uncaught ReferenceError: jQuery is not defined;未捕获的 ReferenceError:$ 未定义 [重复]

ReferenceError:产品未定义