问题描述
我创建了一个自定义脚本以从Google表格中运行,我需要创建一个文件。该脚本使用以下代码摘录:
/*
Custom function to call IEXAPI IEXkeystatearningsdate
@customfunction
*/
function IEXkeystatearningsdate(inputsymbol,stat,version) {
if (version == "SandBox" || version == "sandBox")
var url="https://sandBox.iexapis.com/stable/stock/"+inputsymbol+"/stats/"+stat+"?token=xyz";
else
var url="https://cloud.iexapis.com/stable/stock/"+inputsymbol+"/stats/"+stat+"?token=xyz";
var response=UrlFetchApp.fetch(url); //Call REST API
var json=response.getContentText();
var data = JSON.parse(json); //Parse into JSON object
var d = new Date();
var n = d.toLocaleString();
var fn = "IEXkeystatearningsdate_" + n;
DriveApp.createFile(fn,inputsymbol,MimeType.CSV);
return (data);
}
但是,我收到此消息:
“例外:您无权调用DriveApp.createFile。所需权限:https://www.googleapis.com/auth/drive(第20行)”
当我直接从脚本编辑器运行此脚本时,我不收到此消息。
这是我的清单文件:
{
"oauthScopes": [
"https://www.googleapis.com/auth/drive"
],"timeZone": "America/Los_Angeles","dependencies": {
},"exceptionLogging": "STACKDRIVER","runtimeVersion": "V8"
}
我不使用G-Suite。我仅将google /表格用于个人用途。 OAuth常见问题解答表示应允许个人使用此调用。有人可以帮我解决这个问题吗?
解决方法
从错误描述中,我可以假定您正在简单的onEdit
触发器上运行脚本。
简单的onEdit
触发器无法访问需要授权的服务。
请参见restrictions。
对您来说,这意味着您可以在简单的触发条件下执行DriveApp
。
解决方案:
改为使用Installable trigger。
要这样做:
- 将功能
onEdit()
重命名为非关键字 - 继续
Edit -> Current project's triggers
- 点击
+
创建一个新触发器 - 指定要运行的功能
- 将
Select event type
设置为On edit
自定义功能不能用于调用访问个人数据的服务:
与大多数其他类型的Apps脚本不同,自定义功能从不要求用户授权访问个人数据。因此,他们只能呼叫无法访问个人数据的服务
当然,其中包括DriveApp
。而且它还包含getOAuthToken()之类的东西(通过自定义函数调用时为returns null),因此直接通过UrlFetch
调用Drive API也不起作用。
您应该按照ziganotschka的建议安装onEdit
触发器,或者通过custom menu而不是自定义函数来调用此函数,以便在尝试时被要求授权运行它。