【发布时间】:2021-05-21 22:05:01
【问题描述】:
我有这个代码。
function method3()
{
var spreadsheetID = '1BGi80ZBoChrMXGOyCbu2pn0ptIL6uve2ib62gV-db_o';
var sheetName = 'Form Responses 1';
var queryColumnLetterStart = 'A';
var queryColumnLetterEnd = 'C';
var query = 'select * where B = "8"';
// don't provide last row in range selection
var qvizURL = 'https://docs.google.com/spreadsheets/d/' + spreadsheetID + '/gviz/tq?tqx=out:json&headers=1&sheet=' + sheetName + '&range=' + queryColumnLetterStart + ":" + queryColumnLetterEnd + '&tq=' + encodeURIComponent(query);//(myQuery);
Logger.log('qvizURL: ' + qvizURL);
options = {muteHttpExceptions: true};
// fetch the data
Logger.log(ScriptApp.getOAuthToken());
var ret = UrlFetchApp.fetch(qvizURL, { headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}}).getContentText();
Logger.log('ret: ' + ret);
var obj1 = JSON.parse(ret.replace("/*O_o*/", "").replace("google.visualization.Query.setResponse(", "").slice(0, -2));
Logger.log('obj1:');
Logger.log(obj1);
var data = obj1.table.rows;
Logger.log('#rows: ' + data.length);
for(var i=0;i<data.length;i++) {
values.push({ts:obj.table.rows[i].c[0].f, cs:obj.table.rows[i].c[1].v, or:obj.table.rows[i].c[2].v})
Logger.log(i+': ' + values[i][ts] + ' || ' + values[i][cs] + ' || ' + values[i][or] + ' || ');
}
}
记录器:
18 feb. 2021 22:33:44 Informatie qvizURL: https://docs.google.com/spreadsheets/d/1BGi80ZBoChrMXGOyCbu2pn0ptIL6uve2ib62gV-db_o/gviz/tq?tqx=out:json&headers=1&sheet=Form Responses 1&range=A:C&tq=select%20*%20where%20B%20%3D%20%228%22
18 feb. 2021 22:33:44 Informatie ya29.A0AfH6SMBGpL2mxU7DO5p8RQfCXKP1w13wmU6aBTVZSCjfO-uj_xzkYQziMhnXATEdGREibJk9cATEGioTfQG4aGsNq7Tm05_oD0z1HKu1v4ozBF_B2XegyQ-NuXBJFmJWTX5WEpTOm0RDTlfY6uw8lK3R5HTV
18 feb. 2021 22:33:44 Fout Exception: Request failed for https://docs.google.com returned code 401. Truncated server response: <HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
(use muteHttpExceptions option to examine full response)
at method3(QueryTable:16:27)
尝试添加“muteHttpExceptions:true”。但这只是显示了我获取的 url 中的 HTML。被截断,没有显示任何线索。
我是否需要在某个地方为此 UrlFetch 授权?
****更新***
一切都是用同一个帐户创建的。
这是清单 (appscript.json) 的初始版本:
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"}
然后我添加了 oauthScopes 正如我在https://developers.google.com/apps-script/concepts/scopes#viewing_scopes上看到的那样
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets.readonly",
"https://www.googleapis.com/auth/userinfo.email"
]
}
这产生了:“例外:您无权调用 UrlFetchApp.fetch。所需权限:googleapis.com/auth/script.external_request”。
所以我加了
"https://www.googleapis.com/auth/script.external_request"
这产生了最初的错误消息:异常:https://docs.google.com 的请求失败返回代码 401。截断的服务器响应:...
所以我猜我需要对 oauthScopes 进行更多微调...查看了 https://developers.google.com/workspace/add-ons/concepts/gsuite-scopes#editor_scopes,但不知道该怎么做...
【问题讨论】:
-
很遗憾,我无法理解
It is almost identical to code I run in another Google Script, which works fine. But this one generates an error.。我为此道歉。请问It is almost identical to code I run in another Google Script, which works fine.和But this one generates an error.的区别? -
如果你得到一个 401,那么你当然没有被授权,你需要授权请求。无论是由于云端硬盘文件共享问题还是由于脚本清单中缺少 OAuth 范围授权,执行此脚本的人都无权访问该文件。
-
你好 Tanike。忽略那个。 (我删除了评论)。如果我通过 formSubmit 触发该功能,则代码可以正常工作。当我从 AppScript 手动运行它时,我得到了错误。
-
@tehhowch。我确实得到了那个 OAuth。我从构建代码的同一个帐户触发它。我需要更改某个设置吗?
-
所以我关注了这个developers.google.com/apps-script/concepts/scopes。然后我收到这条消息:“例外:您无权调用 UrlFetchApp.fetch。所需权限:googleapis.com/auth/script.external_request”。所以我也在脚本清单中添加了“googleapis.com/auth/script.external_request”,但随后又得到了原来的错误消息......
标签: javascript google-apps-script