【发布时间】:2019-12-20 15:50:18
【问题描述】:
我正在尝试在 google 电子表格中自动收集有关 Youtube 视频的统计信息。为此,我在电子表格脚本编辑器中使用带有 getYoutubeViews 函数以及 GETURL、linkURL 函数等的代码。
这里是getYoutubeViews函数示例
function getYoutubeViews(videoId){
var url = "https://www.googleapis.com/youtube/v3/videos?part=statistics&id=" + videoId;
url = url + "&key=mykey";
//Utilities.sleep(Math.random(15000))
var videoListResponse = UrlFetchApp.fetch(url);
var json = JSON.parse(videoListResponse.getContentText());
return json["items"][0]["statistics"]["viewCount"];
}
function GETURL(input) {
var range = SpreadsheetApp.getActiveSheet().getRange(input);
var url = /"(.*?)"/.exec(range.getFormulaR1C1())[1];
return url;
}
我遇到了两个问题。
脚本在用户加载表格时开始工作。这会启动大量进程,因为表中的视频数量超过 600 条。这会导致错误:“服务在短时间内调用太多次:exec qps”。
但是用 Utilities.sleep 修复它没有意义,因为还有第二个问题。 Google 的 10,000 点 API 密钥配额在工作 3-4 小时并定期重新加载表格后结束。
我尝试最小化列表中的功能和操作,并使用 Utilities.sleep 来避免此错误:
Service invoked too many times in a short time: exec qps.
Try Utilities.sleep(1000) between calls. (строка 0).
但这似乎无助于解决配额问题。
在我看来,我可以以某种方式将数据保存在单元格中,仅在更新数据时激活功能。我尝试将更改触发器用于这些目的,但要么我做错了,要么没有帮助。
第二个假设是可以以某种方式保存以前的数据,这样即使在脚本错误的情况下单元格中也会有一些数据。但我不知道如何做到这一点。
【问题讨论】:
-
我认为您的问题的原因是使用一个视频 ID 检索到一个
viewCount值。如果在你现在的情况下,通过自定义函数运行getYoutubeViews()的函数,例如,用OnOpen事件触发器运行一个脚本怎么样?在这种情况下,一个 API 调用可以检索多个viewCount值。这样,我认为配额的消耗会减少。
标签: javascript json google-apps-script google-sheets youtube