如何在不同文件中使用 GAS 类,而与文件加载顺序无关?

rom*_*oma 0 global-variables google-apps-script

考虑以下简单示例,文件country.gs

class Country { }
Run Code Online (Sandbox Code Playgroud)

和文件subcountry.gs

class SubCountry extends Country{ }

function test(){}
Run Code Online (Sandbox Code Playgroud)

尝试运行 test() 我得到

ReferenceError: Country is not defined
Run Code Online (Sandbox Code Playgroud)

如果我加入文件或更改加载顺序,它就可以正常工作。

显然,我不想依赖于文件加载顺序,也不想在推送时进行更改(按字母顺序排序),所以这绝对不是重命名文件以便编译它们的好方法。

对此有合适的解决方案吗?

例子:

https://script.google.com/d/1Pipt3YN1FBGkbRRT2PyCHhugd-Xrv3zctIWYwX-cGnAjXfDckwOk7bJh/edit?usp=sharing

The*_*ter 5

正如文档中所写,

这种安排与浏览器处理一个 HTML 文件中多个标签的方式相同。

每个文件就像一个新<script>file content </script>标签,它们按照在 Apps 脚本编辑器中出现的顺序添加。仅当您使用全局变量时这才是问题。明确不鼓励使用全局变量。

注意:依靠特定的文件解析顺序来避免此问题并不是最佳实践。如果复制、删除、重命名或以其他方式重新排列脚本文件,则脚本文件解析的顺序可能会更改。如果可能的话,最好删除对函数调用的任何全局变量依赖。

类实际上是“特殊函数”。您始终可以Class根据文档中的建议将 包含在本地范围内并在需要时进行调用。

片段:

只需将调用函数移至本地范围就可以了

/*subcountry.gs*/

function test(){
  /*local scope*/class SubCountry extends Country{ }
}
Run Code Online (Sandbox Code Playgroud)

为了避免在全局范围内声明类:

/*country.gs*/
var Country;

function main(){
  if (Country == undefined) Country = class Country { }
  return Country;
}
Run Code Online (Sandbox Code Playgroud)
/*subcountry.gs*/

function test(){
  /*initialize class Country*/main()
  /*local scope*/class SubCountry extends Country{ }
}
Run Code Online (Sandbox Code Playgroud)