我已经阅读了一些基本的Google Apps脚本文档/教程。我还没有找到代码执行“范围”的任何解释。
这是我到目前为止所理解的:
All code consists of one or more statements
All statements must (?) be contained in a "function"
(a slight different from non-google javascript? - is this a false assumption?)
All functions reside in a container called a "file"
Each "file" is part of a "project" container (or library)
Each project container is stored in a "spreadsheet" container.
这些是“物理”(编辑访问)边界。
我的问题是,陈述的“逻辑”边界是什么 执行期间?
我首先假设所有变量/对象都是全局的,类似于JavaScript在网页中的运行方式。我不认为“编辑访问”容器限制了变量/对象定义的范围。我错了。
我认为“库”结构类似于PHP“包含”操作。由此我认为这将使我不必将相同的代码集复制到每个应用程序(电子表格容器)中,我需要使用已经“测试过的”代码。我假设所包含项目的可用资源与包含项目公共资源的资源相同。总之,我错了。 “属性”存储在定义的电子表格中,并被视为由包含项目“拥有”。
通过使用它,我现在明白“项目密钥”只是在电子表格容器中添加了一个新的“命名空间”。每个命名空间中发生的事情仍然存在于命名空间之间唯一(最简单)的通信是通过函数参数和返回值。
特别是,User和Project属性的作用域包含在其包含的电子表格文档中。电子表格文档中的每个项目都有单独的用户和项目属性集。
相同的项目/库名称可以出现在多个电子表格文件中,并且完全独立。
这是在某处记录的吗?还有其他我需要知道的关于范围界定的事情(来自不同应用程序共享同一项目/库的线程之间的通信?
此外,如果函数传回对库范围中定义的对象的引用,它是否会在调用的项目中保留?我可以传递/返回指向项目的UserProperties“服务”对象的变量,并且可以访问另一个项目中的数据吗?
这是在库的用户指南结尾处记录的:https://developers.google.com/apps-script/guide_libraries
在决定如何确定范围时,我们试图对最常见的用例进行认真思考,并尝试尽可能减少意外,但我们并不完美。
关于您是否可以使用参数传递在库和项目之间共享ScriptProperties对象的问题,目前这是不可能的。您始终可以针对特定属性公开getter / setter。
如果您有一个有趣的用例,如果没有请求的行为是不可能实现的,请在我们的问题跟踪器中提交一个错误。谢谢!
我也和这个人搏斗过。虽然文档非常好,但有点令人困惑。
共享和不共享的概念让我有点试验和错误。
我确实想提一下UserProperties存在于用户级别,并不仅仅与项目或库相关联。使用库时,无需像使用ScriptProperties那样传递UserProperties。
干净利落的东西:-)
吉姆