“在全局范围内调用方法UrlFetchApp.fetch。” Google Apps脚本Ediotor执行提示

时间:2016-02-18 10:41:53

标签: google-apps-script google-sheets

我正在谷歌应用脚​​本编辑器中开发一个谷歌电子表格插件。

正如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.
}

我的问题是:

  1. 为什么他们会有这种差异?
  2. 如果我仍然想使用像var T =(function(){}())这样的模块模式,我怎么能摆脱“在全局范围内运行”的问题呢?

1 个答案:

答案 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
  }

})()