到2021年,使用V8引擎,我想知道在Google脚本中使用全局变量是否是个好主意?如果是的话,如何使用呢?我的方式是个好方法吗(下面描述)?
当然,现在我检查了所有其他类似的问题。但仍有一些细节我找不到:
基本上,我试图做的是不重复代码:我有多个函数,并且存储活动的电子表格和当前的表,如下所示:
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
这导致了
重复(1)-实例化电子表格和工作表(2)
对吗?
所以,每当我在多个函数中有共同的局部变量时,我就考虑使用全局变量(GV)。
但是,由于在每个函数调用上都会不必要地分配它们(还有其他函数不需要GVs),所以我尝试只在需要时(只有当函数调用使用它们时)才定义它们--方法是不使用定义关键字(var,const,let):
根据这个link,它似乎是一种很好的方法(模式1)。
不管怎么说,我想知道是否还有其他的考虑或缺点我不知道?走这条路真的好吗?因为到目前为止,我还没有看到任何实现这个功能的片段,而且我看到了很多气体片段。
我意识到的一个缺点是,对于我的GV来说,新的GAS编辑器缺乏自动完成功能(因为我没有使用'var‘或'let’来定义它们的范围Global。)
否则,我就知道PropertiesService和CacheService了。然而,我愿意重用我的脚本(其中我定义了我的GVs)作为我的其他脚本的库。
此外,您只能将值存储为PropertiesService和CacheService中的字符串(而不是SpreadsheetApp.getActiveSpreadsheet()),对吗?更不用说,在脚本执行之后,我不需要持久化。
所以我也不太愿意用它们来代替GVs。
发布于 2021-11-22 17:03:15
可以使用my answer
()=>{}
)来避免直接执行,并使用Object.defineProperty()
添加getter.
ss
、sheet1
、sheet2
、rangeOfSheet1
和rangeOfSheet2
作为全局变量,则如果您访问rangeOfSheet2
,则只加载它的依赖项,即sheet1
和ss
。其余的都没有被碰过。--const g = {};//global object
const addGetter_ = (name, value, obj = g) => {
Object.defineProperty(obj, name, {
enumerable: true,
configurable: true,
get() {
delete this[name];
return (this[name] = value());
},
});
return obj;
};
//MY GLOBAL VARIABLES in g
[
['ss', () => SpreadsheetApp.getActive()],
['MasterSheet', () => g.ss.getSheetByName('Sheet1')],
['MasterRangeColA1_5', () => g.MasterSheet.getRange('A1:A5')],
['MasterRangeColAValues', () => g.MasterRangeColA1_5.getValues()],
].forEach(([n, v]) => addGetter_(n, v));
const test = () => {
console.info('start');
console.log({ g });
console.info('Accessing MasterSheet');
console.log(g.MasterSheet);
console.log({ g }); //note ss is loaded as well
console.info('Accessing MasterRangeColAValues');
console.log(g.MasterRangeColAValues);
console.log({ g }); //note MasterRangeColA1_5 is loaded as well
};
与全局对象g
不同,我们还可以使用全局this
,在这种情况下,所有变量都直接成为全局对象的成员:
const addGetter_ = (name, value, obj = this) => {
Object.defineProperty(obj, name, {
enumerable: true,
configurable: true,
get() {
delete this[name];
return (this[name] = value());
},
});
return obj;
};
[
['ss', () => SpreadsheetApp.getActive()],
['MasterSheet', () => ss.getSheetByName('Sheet1')],
['MasterRangeColA1_5', () => MasterSheet.getRange('A1:A5')],
['MasterRangeColAValues', () => MasterRangeColA1_5.getValues()],
].forEach(([n, v]) => addGetter_(n, v));
const test = () => {
console.info('start');
console.log(this);
console.info('Accessing MasterSheet');
console.log(MasterSheet);
console.log(this); //note ss is loaded as well
console.info('Accessing MasterRangeColAValues');
console.log(MasterRangeColAValues);
console.log(this); //note MasterRangeColA1_5 is loaded as well
};
g.
,但是,全局空间受到了污染。https://stackoverflow.com/questions/70056310
复制