首页 > 解决方案 > 在 App Scripts (js) 中运行 Youtube 数据服务时出错 - 已超出未经验证使用的每日限制

问题描述

我正在使用 Youtube (YouTube Data API v3) 高级服务的 App Scripts 中运行自定义函数。运行时,我收到以下错误:

GoogleJsonResponseException:对 youtube.videos.list 的 API 调用失败并出现错误:已超出未经身份验证使用的每日限制。继续使用需要注册。(第 15 行)。

我不确定如何验证我的应用程序。我已将其添加到云项目并启用了 API。

更新:这是我的代码的样子:

function getYoutubeData(youtubeId) {

  // Don't run on empty
  if(!youtubeId){return null}

  // Make the request
  var vidData = YouTube.Videos.list("statistics, snippet", {id: youtubeId}).items;
  if (!vidData|vidData.length<1){return null}

  // Get the first item
  vidData = vidData[0];

  return vidData.statistics
}

标签: javascriptgoogle-apps-scriptgoogle-cloud-platformyoutube-api

解决方案


我相信你的目标如下。

  • 您想将vidData.statistics脚本中的值放入单元格中。
  • 您想使用自定义函数来实现这一点,例如=getYoutubeData(youtubeId).

为此,这个答案怎么样?

问题和解决方法:

不幸的是,当在自定义函数中使用高级 Google 服务的 YouTube 数据 API 时,不使用访问令牌。从您的脚本来看,我认为您的问题的原因是这个。例如,当 的函数const sample = () => ScriptApp.getOAuthToken();用作自定义函数=sample()时,不返回任何值。我认为这是谷歌方面目前的规范,因为安全性。

为了在上述情况下实现您的目标,以下变通方法如何?

解决方法 1:

在此解决方法中,首先将 youtube ID 设置为 Google 电子表格中的单元格。并且 的值vidData.statistics由不是自定义函数的 Google Apps 脚本检索,并将 youtube ID 替换为结果值。

示例脚本:

请将 youtube ID 的单元格范围设置为sourceRange和工作表名称。在示例中,它假设 youtube ID 被放置到单元格“A1:A10”中。请getYoutubeData()在脚本编辑器中运行。当然,您也可以将此设置为自定义菜单。

function getYoutubeData() {
  const sourceRange = "A1:A10"; // Please set the range of cells of youtube IDs.
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");  // Please set the sheet name.

  const range = sheet.getRange(sourceRange);
  const youtubeIds = range.getValues();
  const values = youtubeIds.map(([youtubeId]) => {

    // This is your script.
    if(!youtubeId){return [null]}
    var vidData = YouTube.Videos.list("statistics, snippet", {id: youtubeId}).items;
    if (!vidData|vidData.length<1){return [null]}
    vidData = vidData[0];
    return [JSON.stringify(vidData.statistics)];

  });
  range.setValues(values);
}

解决方法 2:

在此解决方法中,使用了自定义函数。但是,在这种情况下,Web 应用程序被用作包装器。这样,授权过程在 Web 应用程序中完成。所以自定义函数可以在没有授权的情况下运行。请执行以下流程。

1. 准备脚本。

当你的脚本被使用时,它变成如下。请将以下脚本复制并粘贴到脚本编辑器中。

示例脚本:
// This is your script.
function getYoutubeData_forWebApps(youtubeId) {
  // Don't run on empty
  if(!youtubeId){return null}

  // Make the request
  var vidData = YouTube.Videos.list("statistics, snippet", {id: youtubeId}).items;
  if (!vidData|vidData.length<1){return null}

  // Get the first item
  vidData = vidData[0];

  return vidData.statistics
}

// Web Apps using as the wrapper.
function doGet(e) {
  const res = getYoutubeData_forWebApps(e.parameter.youtubeId)
  return ContentService.createTextOutput(JSON.stringify(res));
}

// This is used as the custom function.
function getYoutubeData(youtubeId) {
  const url = "https://script.google.com/macros/s/###/exec?youtubeId=" + youtubeId;  // Please set the URL of Web Apps after you set the Web Apps.
  return UrlFetchApp.fetch(url).getContentText();
}

2. 部署 Web 应用程序。

  1. 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
  2. “将应用程序执行为:”选择“我” 。
    • 这样,脚本作为所有者运行。
  3. “谁有权访问应用程序:”选择“任何人,甚至匿名” 。
    • 在这种情况下,不需要请求访问令牌。我认为我建议使用此设置来测试此解决方法。
    • 当然,您也可以使用访问令牌。但是,在这种情况下,当使用访问令牌时,此示例脚本不能直接用作自定义函数。
  4. 单击“部署”按钮作为新的“项目版本”。
  5. 自动打开“需要授权”对话框。
    1. 单击“查看权限”。
    2. 选择自己的帐户。
    3. 在“此应用未验证”中单击“高级”。
    4. 点击“转到###项目名称###(不安全)”
    5. 单击“允许”按钮。
  6. 单击“确定”。
  7. 复制 Web 应用程序的 URL。就像https://script.google.com/macros/s/###/exec

    • 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
  8. 请设置上述脚本的https://script.google.com/macros/s/###/execURL url。请重新部署 Web 应用程序。这样,最新的脚本就会反映到 Web 应用程序中。所以请注意这一点。

4. 测试此解决方法。

请放到=getYoutubeData("###youtubeId###")牢房里。这样,youtube ID 将发送到 Web 应用程序,并且 Web 应用程序返回vidData.statistics.

笔记:

  • 这些是用于解释变通方法的简单示例脚本。所以在使用的时候,请根据自己的实际情况进行修改。

参考:


推荐阅读