GS的文件执行顺序项目(Execution order of GS files in a Proje

2019-08-01 02:22发布

在哪里可以找到关于为GS文件的执行顺序规则的文档?

要标注的问题,我创建了自己的文件中的两个平凡的对象,每个对象。

1_File.gs

var ObjB = new Object();
ObjB.sayName = "[" + ObjA.sayName + "]";

0_File.gs

var ObjA = new Object();
ObjA.sayName = " I'm A ";

一个调用,如...

Logger.log(ObjA.sayName + " : " + ObjB.sayName);

...获得误差...

TypeError: Cannot read property "sayName" from undefined.

如果我从1_File.gs代码进入0_File.gs,反之亦然,那么有没有错误,并且日志显示正确...

我答:[我是一个]

重命名0_File.gs到2_File.gs不影响执行顺序要么,所以我认为顺序取决于该文件被第一次创建的。

有没有“有”或“进口”,让我做出明确的执行顺序的概念?

Answer 1:

在哪里可以找到关于为GS文件的执行顺序规则的文档?

有没有这样的文件,我认为不会被任何时候公布。 以类似的方式,在C ++中的静态变量的初始化顺序也是未定义的,并取决于编译器/链接器。

有没有“有”或“进口”,让我做出明确的执行顺序的概念?

是的,有没有“包括”,“进口”,甚至“模块”,但也有图书馆 。

也有一种变通方法,通过使用封闭。 波纹管是一个示例代码。 通过执行测试功能日志包含cd 。 我们的想法是在所有gs文件功能开始init 。 在这些功能的全部全局变量实例化。 匿名闭包是在执行Code.gs文件实例和调用所有“初始化”功能的所有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);
}

d.gs

var d;

function initD() {
  d = { value : 'd' };
};


Answer 2:

我在每个文件中创建一个类,并确保每个类是在原来的实例解决了这个问题Code.gs (我改名为_init.gs )。 每个实例化类作为的一种形式include与确保一切都准备好执行任何东西之前。

_init.gs

// These instances can now be referred to in all other files
var Abc  = new _Abc();
var Menu = new _Menu();
var Xyz  = new _Xyz();
var Etc  = new _Etc();

// We need the global context (this) in order to dynamically add functions to it
Menu.createGlobalFunctions(this);

function onInstall(e) {
  onOpen(e);
}

function onOpen(e) {
  Menu.build();
}

和类通常是这样的:

menu.gs

function _Menu() {
  this.build = function() {
    ...
  }

  ...
}


Answer 3:

如果你有继承不止一个级别,你需要给初始化函数的名称,如init000Fooinit010Barinit020Baz ,然后执行之前的名字初始化函数进行排序。 这将确保init000Foo首先得到评估,然后Bar ,然后Baz

function callAllInits() {
  var keys = Object.keys(this);
  var inits = new Array();
  for (var i = 0; i < keys.length; i += 1) {
    var funcName = keys[i];
    if (funcName.indexOf("init") == 0) {
      inits.push(funcName);
    }
  }

  inits.sort();
  for (var i = 0; i < inits.length; i += 1) {
    // To see init order:
    // Logger.log("Initializing " + inits[i]);
    this[inits[i]].call(this);
  }
}


Answer 4:

目前在谷歌Apps脚本没有这样的命令。 这纯粹取决于你在哪里有这些对象中声明你的函数是如何调用。 你能解释一下自己的Logger.log()代码将如何以及何时被调用。 此外,当你宣布你的对象objA和objB? 这些将帮助我们提供更好的答案



Answer 5:

其他答案(即不写它引用其他文件中的对象的任何顶级代码)描述,以避免这个问题的理想方式。 但是,如果你已经写了很多的代码,并且重写其不可行,还有一个解决办法:

谷歌应用程序脚本出现加载在创建它们的顺序代码文件。 最早的文件第一,其次是下了,最近创建的文件的最后。 这是在编辑器中显示的顺序时,“文件排序按字母顺序”是没有选。

因此,如果你在这个秩序中的文件:

  • Code.gs
  • 1_File.gs(取决于0_File.gs)
  • 0_File.gs

一个简单的办法就是让1_File.gs的副本,然后删除原始,有效地将它移到列表的末尾。

  1. 点击旁边的三角形1_File.gs,选择“制作副本”
    • Code.gs
    • 1_File.gs
    • 0_File.gs
    • 1_File copy.gs
  2. 点击旁边的三角形1_File.gs并选择“删除”
    • Code.gs
    • 0_File.gs
    • 1_File copy.gs
  3. 点击旁边的三角形1_File copy.gs并选择“重命名”,然后从末尾删除“复制”。
    • Code.gs
    • 0_File.gs
    • 1_File.gs

现在0_File.gs是1_File.gs之前加载。



Answer 6:

这里是我会怎么做?

主要

function include(filename) {
  return ContentService.createTextOutput(filename);
}

function main() {
  include('Obj A');
  include('Obj B');
  Logger.log(ObjA.sayName + " : " + ObjB.sayName);
}

一个OBJ

var ObjA = new Object();
ObjA.sayName = " I'm A ";

OBJ乙

var ObjB = new Object();
ObjB.sayName = "[" + ObjA.sayName + "]";


文章来源: Execution order of GS files in a Project