我想在 Google Sheets 插件中为动态菜单设置动态功能。我正在使用以下代码:
function onOpen(e) {
var menu = SpreadsheetApp.getUi().createAddonMenu();
for (var i = 0; i < array.length; i++) {
const element = array[i];
var functionName = "_" + element.name;
var args = element.args;
this[functionName] = dynamicItem(args); //didn't work
//this[functionName] = function () {myopen(args);} //didn't work
//eval("function " + functionName + "() { myopen('" + args + "') }"); //didn't work
menu.addItem(element.name, functionName);
}
menu.addToUi();
}
function dynamicItem(args) {
return function () {
myopen(args);
};
}
Run Code Online (Sandbox Code Playgroud)
当我单击菜单项时,出现以下异常:
“未找到脚本函数:函数名称 …
截至 2021 年,对于 V8 引擎,我想知道在 Google Apps 脚本中使用全局变量是否是个好主意?如果是的话,如何使用它们?我的方法是个好方法吗(如下所述)?
\n当然,现在我检查了所有其他类似的问题。但仍然有一些细节我找不到:
\n基本上我试图做的是不重复代码:我有多个函数,并且我正在存储活动电子表格和当前工作表,如下所示:
const ss = SpreadsheetApp.getActiveSpreadsheet();\nconst sheet = ss.getActiveSheet();\nRun Code Online (Sandbox Code Playgroud)\n\n正确的?
\n因此,每当我在多个函数中有公共局部变量时,我就想到使用全局变量(GV)。
\n然而,由于它们\xe2\x80\x99re将在每个函数调用上不必要地分配(还有其他不需要GV的函数),所以我尝试仅在需要时定义它们(仅当有函数时)使用它们的调用) - 不使用定义关键字(var、const、let):\n
根据这个链接,这似乎是一个很好的方法(模式1)。
\n无论如何,我想知道是否还有其他我不知道的考虑因素或缺点?走这条路真的是个好主意吗?因为到目前为止,我没有看到\xe2\x80\x99有任何实现这个的代码片段,而且我看到了很多GAS代码片段。
\n我知道的一个缺点是我的 GV 在新的 GAS 编辑器中缺乏自动补全功能(因为我没有使用“var”或“let”来定义它们来故意将其范围设置为 Global )。
\n否则,我知道 PropertiesService 和 CacheService。不过,我愿意重用我的脚本(我在其中定义了 GV)作为其他脚本的库。
\n另外,您只能将值作为字符串存储在 PropertiesService 和 CacheService 中(而不是 SpreadsheetApp.getActiveSpreadsheet() 中),对吗?更不用说脚本执行后我不需要持久性。
\n所以我也犹豫是否使用它们而不是 GV。