我正在谷歌应用脚本编辑器中开发一个谷歌电子表格插件。
正如https://developers.google.com/apps-script/add-ons/lifecycle所述,有时脚本以限制授权模式运行,因此我们不会在全局范围内编写任何需要高权限的代码(如UrlFetch)。
警告:当您的onOpen(e)函数运行时,将加载整个脚本并执行任何全局语句。这些语句在与onOpen(e)相同的授权模式下执行,如果模式禁止它们将失败。这可以防止onOpen(e)运行。如果您发布的加载项无法添加其菜单项,请在浏览器的JavaScript控制台中查看是否抛出错误,然后检查您的脚本以查看onOpen(e)函数或全局变量是否调用不允许的服务在AuthMode.NONE中。
但我发现了“在全球范围内调用”的一种非常奇怪的行为。我将所有代码放在闭包中,然后调用它们,但仍然警告说我在全局范围内运行UrlFetchApp。
最后,我发现了“在全球范围内运行”v.s中的区别。 “not global”,是因为第一个是var g = function () { /* UrlFetchApp here */ }
,第二个是function ng() { /* UrlFetchApp here */ ]
。
以下代码可以在Google Script Editor中运行。如果使用T.g()运行testGlobalScope(),将收到警告。然而,只运行T.ng(),没关系。
var T = (function() {
var g = function () {
// Method UrlFetchApp.fetch invoked in the global scope.
try { UrlFetchApp.fetch('http://google.com') } catch (e) {}
}
function ng() {
try { UrlFetchApp.fetch('http://google.com') } catch (e) {}
}
return {
g: g
, ng: ng
}
}())
function testGlobalScope() {
T.g() // T.g() will cause Script Editor show "Execution Hints" with red light: Method UrlFetchApp.fetch invoked in the global scope.
// T.ng() // This will not show any warning.
}
我的问题是:
答案 0 :(得分:2)
这是一个比较老的,但会尝试回答。
0)尽管该警告确实显示在脚本编辑器中,但即使未向脚本授予任何权限,它似乎也无法阻止onOpen
函数的运行。因此,可能没有任何实际原因显示警告。
0.1)尽管如此,它仍然显示出来,与声明T
的准确程度无关紧要:无论是function T()
,var T = function T() { ... }
还是var T = (function() { ... }())
,警告都会继续显示出来。
1)真的不知道,只能基于上面和下面进行假设(也许Execution hints
会认为任何匿名函数都属于全局范围?)。
2)但是,尽管g
必须是一个命名函数,但看起来仍然有一种方法可以消除警告,同时仍将函数声明为表达式:
var T = (function() {
var g = function g() {
// No "Method UrlFetchApp.fetch invoked in the global scope." warning
try { UrlFetchApp.fetch('http://google.com') } catch (e) {}
}
function ng() {
try { UrlFetchApp.fetch('http://google.com') } catch (e) {}
}
return {
g: g
, ng: ng
}
})()