google-apps-script - Google Apps 脚本 URLFetchApp 权限
问题描述
我是 GAS 的新手,我在许可系统上遇到了困难。
我是普通的 Google 驱动器用户,我创建了一个电子表格并尝试向其中添加一些代码。我的代码正在运行,但前提是我在代码编辑器中。我想使用 onEdit() 函数,所以它在工作表中也能工作对我来说很重要。当我第一次在编辑器中运行我的代码时,它打开了一个新窗口,我需要在其中输入我的凭据以允许脚本,然后它就可以工作了。如果我对工作表中的单元格进行一些更改并且触发了 onEdit() 函数,我会收到一条错误消息,内容如下(已翻译):
Exception: You are not permitted to call UrlFetchApp.fetch. Required permission: https://www.googleapis.com/auth/script.external_request
在编辑器中,我显示了清单文件并向 oauthScopes 添加了权限,但在工作表中我仍然收到消息。这就是我的代码的样子(简化):
function onEdit(e)
{
var data = {
'key1': 'value1',
'key2': 'value2'
};
var options = {
'method' : 'post',
'contentType': 'application/json',
'payload' : JSON.stringify(data)
};
try{
var response = UrlFetchApp.fetch('https://a-working-url.com', options); //error happening in this line
//some more data wizardry
}catch(error)
{
Browser.msgBox(error)
}
}
任何想法如何在我的工作表中打开此权限屏幕或任何提示如何以不同的方式解决它?我想创建一个在后台运行一些代码的工作表。我想与一些朋友分享这张表格,之前用 Excel 和 VBA 尝试过,直到我意识到它不适用于 Excel Online,所以我切换到 GAS。
在此先感谢您的帮助 :)
解决方案
onEdit()
和所有简单的触发器一样,受以下限制(参见官方文档):
- 该脚本必须绑定到 Google 表格、幻灯片、文档或表单文件,或者是扩展这些应用程序之一的附加组件。
- 如果以只读(查看或评论)模式打开文件,它们不会运行。
- 脚本执行和 API 请求不会导致触发器运行。例如,调用 Range.setValue() 来编辑单元格不会导致电子表格的 onEdit 触发器运行。
- 他们无法访问需要授权的服务。例如,简单触发器无法发送电子邮件,因为 Gmail 服务需要授权,但简单触发器可以使用匿名的语言服务翻译短语。
- 他们可以修改他们绑定的文件,但不能访问其他文件,因为这需要授权。
- 他们可能也可能无法确定当前用户的身份,这取决于一组复杂的安全限制。
- 它们的运行时间不能超过 30 秒。
- 在某些情况下,编辑器插件会在无授权模式下运行它们的 onOpen(e) 和 onEdit(e) 简单触发器,这会带来一些额外的复杂性。有关更多信息,请参阅附加授权生命周期指南。
- 简单触发器受 Apps 脚本触发器配额限制的约束。
以粗体突出显示的内容适用于您的问题。
基本上,它归结为 -是一项需要授权的服务,因此即使您在清单文件中设置了关联的范围,UrlFetchApp.fetch()
您也无法从触发器执行它。onEdit(e)
推荐阅读
- bash - 检查 curl 响应代码并从 bash 函数内部返回结果
- azure - 如何使用 cli 从 Azure 文件共享中删除文件夹
- javascript - 尽管可能有多个匹配项,但如何仅从映射的数据中动态渲染出一段内容?
- python - 将多行 txt 数据转换为 CSV
- reactjs - 为函数而不是组件反应延迟加载
- facebook - 当用户通过“应用程序和网站”设置从 Facebook 删除我的应用程序并尝试在我的应用程序中重新连接时会发生什么?
- sharepoint-online - 是否可以将值从属性传递到 SPFx 中的 CSS?
- powershell - PowerShell:带有字符串参数的 pwsh -Command/-File 包含要传递给以根路径为值的子进程的参数
- react-hook-form - react-hook-form:如何在 reactstrap CustomInput 中重置标签
- apache-spark - spark 2.4:AQE 是否优先于 spark.sql.shuffle.partitions?