项目中GS文件的执行顺序

Mar*_*ell 18 google-apps-script

我在哪里可以阅读有关GS文件执行顺序规则的文档?

为了确定问题的维度,我创建了两个简单的对象,每个对象都在自己的文件中.

1_File.gs

var ObjB = new Object();
ObjB.sayName = "[" + ObjA.sayName + "]";
Run Code Online (Sandbox Code Playgroud)

0_File.gs

var ObjA = new Object();
ObjA.sayName = " I'm A ";
Run Code Online (Sandbox Code Playgroud)

像...这样的电话

Logger.log(ObjA.sayName + " : " + ObjB.sayName);
Run Code Online (Sandbox Code Playgroud)

......得到错误......

TypeError: Cannot read property "sayName" from undefined.
Run Code Online (Sandbox Code Playgroud)

如果我将代码从1_File.gs移动到0_File.gs,反之亦然,那么没有错误,日志显示正确...

我是A:[我是A]

将0_File.gs重命名为2_File.gs也不会影响执行顺序,因此我假设该顺序取决于首先创建的文件.

是否没有"包含"或"导入"的概念可以让我明确执行执行顺序?

meg*_*024 11

我在哪里可以阅读有关GS文件执行顺序规则的文档?

没有这样的文件,我认为不会发布任何时间.以类似的方式,C++中静态变量的初始化顺序也是未定义的,并且依赖于编译器/链接器.

是否没有"包含"或"导入"的概念可以让我明确执行执行顺序?

是的,没有"包含","进口"甚至"模块",但有图书馆.

还有一个使用闭包的解决方法.贝娄是一个示例代码.通过执行日志包含的测试功能c.d.我们的想法是在所有gs文件中都有一个以函数开头的函数init.在这些函数中,所有全局变量都是实例化的.匿名闭包在Code.gs文件实例化期间执行,并调用所有文件的所有"init"函数gs.

Code.gs

var c;

function callAllInits_() {
  var keys = Object.keys(this);
  for (var i = 0; i < keys.length; i++) {
    var funcName = keys[i];
    if (funcName.indexOf("init") == 0) {
      this[funcName].call(this);
    }
  }
}

(function() {
  callAllInits_();
  c = { value : 'c.' + d.value };
})();

function test() {
  Logger.log(c.value);
}
Run Code Online (Sandbox Code Playgroud)

d.gs

var d;

function initD() {
  d = { value : 'd' };
};
Run Code Online (Sandbox Code Playgroud)