首页 > 解决方案 > 如何在不同的文件中使用 GAS 类,与文件加载顺序无关?

问题描述

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

class Country { }

和文件subcountry.gs

class SubCountry extends Country{ }

function test(){}

试图运行 test() 我得到

ReferenceError: Country is not defined

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

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

有没有合适的解决方案?

例子:

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

标签: google-apps-scriptglobal-variables

解决方案


文档中所述,

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

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

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

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

片段:

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

/*subcountry.gs*/

function test(){
  /*local scope*/class SubCountry extends Country{ }
}

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

/*country.gs*/
var Country;

function main(){
  if (Country == undefined) Country = class Country { }
  return Country;
}
/*subcountry.gs*/

function test(){
  /*initialize class Country*/main()
  /*local scope*/class SubCountry extends Country{ }
}

推荐阅读