我正在尝试根据某些条件使用Google Script(JavaScript)添加指向Google表格中菜单的链接。添加菜单项的Google's API template如下:
addItem(caption, functionName)
functionName
参数本身不能接受输入参数,因为我的文档中有可变数量的工作表,我试图在for循环中生成任意数字函数,以便它们可用无需任何输入参数:
function createGotoMenuFunctions(scope) {
var ss = SpreadsheetApp.getActive();
var sheets = ss.getSheets();
for (var s=0; s<sheets.length; s++){
var sht = sheets[s];
var shtName = sht.getName();
var funcName = 'goto' + shtName.replace(/\s/g, '_') + 'menu';
scope[funcName] = function() {
ss.setActiveSheet(sht);
}
}
}
createGotoMenuFunctions(this); //global scope
这会为每个名为({1}},gotoSheet1menu()
,gotoSheet2menu()
的工作表创建一组函数。但是,当我调用任何函数时,它们都会激活最后一页。例如,如果我调用gotoSheet3menu()
,它会激活Sheet3。我认为这是由于gotoSheet1menu()
和ss
通过引用传递而不是通过值传递。有办法解决这个问题吗?
答案 0 :(得分:0)
createGotoMenuFunctions闭包将保留sht的一个副本,这是最后一个表,因为它在结尾处声明。当函数执行时,它将无法在自己的闭包中找到sht,并将接近封闭它的闭包。所以它会得到sht(最后一页复印件)。
要获得正确答案,您应该在功能之后使用绑定:
scope[funcName].bind({sht: sheets[s]})
答案 1 :(得分:0)
这也是一种将sht
绑定到闭包的方法:
scope[funcName] = function(_sht) {
return function() {
ss.setActiveSheet(_sht);
}
}(sht);
(见这个问题,它类似:javascript closure immediate evaluation)