javascript - 在 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
}
解决方案
我相信你的目标如下。
- 您想将
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 应用程序。
- 在脚本编辑器上,通过“发布”->“部署为 Web 应用程序”打开一个对话框。
- 为“将应用程序执行为:”选择“我” 。
- 这样,脚本作为所有者运行。
- 为“谁有权访问应用程序:”选择“任何人,甚至匿名” 。
- 在这种情况下,不需要请求访问令牌。我认为我建议使用此设置来测试此解决方法。
- 当然,您也可以使用访问令牌。但是,在这种情况下,当使用访问令牌时,此示例脚本不能直接用作自定义函数。
- 单击“部署”按钮作为新的“项目版本”。
- 自动打开“需要授权”对话框。
- 单击“查看权限”。
- 选择自己的帐户。
- 在“此应用未验证”中单击“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 单击“确定”。
复制 Web 应用程序的 URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
请设置上述脚本的
https://script.google.com/macros/s/###/exec
URLurl
。请重新部署 Web 应用程序。这样,最新的脚本就会反映到 Web 应用程序中。所以请注意这一点。
4. 测试此解决方法。
请放到=getYoutubeData("###youtubeId###")
牢房里。这样,youtube ID 将发送到 Web 应用程序,并且 Web 应用程序返回vidData.statistics
.
笔记:
- 这些是用于解释变通方法的简单示例脚本。所以在使用的时候,请根据自己的实际情况进行修改。
参考:
推荐阅读
- python - MongoDB JSON输入意外结束,使用python进行抓取
- scala - RestartSource 屏蔽包装源的物化值?
- ruby-on-rails - 自动刷新页面(使用 Ruby On Rails 做出反应)
- java - 有没有办法模拟一个方法而不必模拟该方法中的任何调用?
- python - Django MEDIA_ROOT 指向网络驱动器
- java - 运行/调试在 IntelliJ IDEA 中不起作用
- c# - 更改数据网格中的突出显示文本画笔键
- python - Matplotlib:imshow(imread()) 给出奇怪的结果 - Python3
- google-app-engine - 将 Next.js 应用程序部署到 App Engine Standard [Nodejs] 并收到 500 错误
- java - Android中另一个类中的实例变量