- 您想要创建自定义菜单。
- 您想要通过编辑电子表格来更新自定义函数。
- 您想使用一个函数名称,例如
myFunction()
用于自定义菜单中的多个功能。
- 当从自定义菜单运行函数时,您希望将每个值作为参数赋予函数。
- The sample situation is as follows.
- “A”至“I”列中有值。
- 自定义菜单中有9个功能。自定义菜单是在打开电子表格时创建的。函数名称与每个列名称相对应。
- 当点击“A”列的功能时,“A”列的值被激活。
- 当“I”列复制到“H”列时,新功能将添加到自定义菜单中。
我的理解就像上面一样。如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案之一。
问题和解决方法:
不幸的是,在现阶段,当一个功能被添加到自定义菜单时addItem
方法时,参数无法使用。并且当运行自定义菜单中的功能之一时,无法检索有关所运行的功能名称的信息。这样,你的目标就无法直接实现。因此需要使用解决方法。
当我看到你的问题时,为了你的目标,我想这个线程很有用。在google.script.run中,要求能够在脚本编辑器中直接运行该函数,并且该函数包含在this
。但是在自定义菜单中,当该功能包含在this
,即使无法在脚本编辑器中直接运行该函数,也可以运行该函数。当函数仅在GAS端运行时,即使无法直接使用脚本编辑器运行该函数,也可以运行该函数。我认为这种情况可以作为解决方法。
修改后的脚本:
当您的脚本通过包含此解决方法进行修改时,它会变成如下所示。请将其复制并粘贴到电子表格的容器绑定脚本中,该脚本的标题(“Col1”、“Col2”,)位于第一行,值来自第二行。当您运行脚本时,请打开电子表格。至此,自定义菜单就添加完成了。当通过复制添加新列时,附加列也会添加到自定义菜单中。当运行自定义菜单中的功能时,对应于该列的值被激活。
From:
function onOpen(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addSeparator();
var subMenu = ui.createMenu('Sub-menu');
for (var i = 0; i < headers.length; i++) {
var dynamicMenu = headers[i];
subMenu.addItem(dynamicMenu,'dynamicItem');
}
menu.addSubMenu(subMenu).addToUi();
}
function onEdit(e) {
onOpen(e);
}
function menuItem1() {
SpreadsheetApp.getUi()
.alert('You clicked the first menu item!');
}
function dynamicItem() {
SpreadsheetApp.getUi()
.alert('You clicked the dynamic menu item!');
}
To:
function installFunctions() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('Custom Menu')
.addItem('First item', 'menuItem1')
.addSeparator();
var subMenu = ui.createMenu('Sub-menu');
for (var i = 0; i < headers.length; i++) {
var dynamicMenu = headers[i];
this[dynamicMenu] = dynamicItem(i); // Added
subMenu.addItem(dynamicMenu,dynamicMenu); // Modified
}
menu.addSubMenu(subMenu).addToUi();
}
function dynamicItem(i) { // Added
return function() {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(2, i + 1, sheet.getLastRow() - 1, 1).activate();
}
}
installFunctions(); // Added
function onOpen() {} // Modified: This can be used as the simple trigger.
function onEdit() {} // Modified: This can be used as the simple trigger.
function onChange() {} // Added: Please install OnChange event trigger to this function.
- 在使用该脚本之前,请先给函数安装OnChange事件触发器
onChange()
。这样,当删除该列时,自定义菜单就会更新。
- 的功能
function onEdit() {}
and function onChange() {}
用于跑步onOpen();
.
Result:
Note:
- 为了动态创建自定义菜单,需要在函数运行的初始阶段运行该脚本。所以需要将其设置为全局的
onOpen();
.
- 在此解决方法中,当函数运行时,
onOpen
每次都会运行。所以当列数较多时,工艺成本会很高。所以请小心这一点。
- 这是一个简单的示例脚本,用于解释解决方法的一种方法。所以请根据您的情况修改此内容。
参考:
- 自定义菜单
-
Different output in 3 anonymous function in GAS