动态创建电子表格菜单项
我正在尝试使用Google Apps脚本在Google表中创建一个动态填充的菜单。
- 我有一个表格“课”,我列出了我教的课程。
- 在运行脚本时,我会得到我的脚本来阅读并将这些类加载到数组中。
- 为了仅在原始“类”表中的硬码值,我想为每个类别创建一个子菜单项目。
表被称为“类”。 类表中的值是8h,9p1,9p2。 它们在细胞A1:A12中。 在调试器中,MenuiteMarray的数组中,与“类”表中的所有预期类正确加载。
我得到的错误是:
typeError:无法在对象9p1中找到函数添加sudsubmenu。 (第13行 文件“代码”)
这是当逐步进入行时,
menuItemArrayClass = menuItemArray [menuCount]
我真的很感激我做错了什么或做任何更好的方法。
这是我的代码:
function onOpen(e) {
var ui = SpreadsheetApp.getUi();
var menuCount = 0;
ui.createMenu('Manage Timetable')
.addItem('First item', 'menuItem1')
.addSeparator()
var menuItemArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Classes').getDataRange().getValues();
for (menuCount=1;menuCount < menuItemArray.length;++menuCount) {
var menuItemArrayClass = []
menuItemArrayClass = menuItemArray [menuCount]
.addSubMenu(ui.createMenu('Manage Classes')
.addItem(menuItemArrayClass [menuCount] + 'Schedule Timetable', 'runBatch1'))
.addToUi();
}
}
I am trying to create a dynamically populated menu in Google Sheets using Google Apps Script.
- I have a sheet, 'Classes', where I list the classes I teach.
- On running my script I get my script to read and load these classes into an array.
- In order to only hard-code values in the original 'Classes' sheet I want to then to create a sub-menu item for each of these classes.
The sheet is called 'Classes'.
The values in the classes sheet are 8H, 9p1, 9p2 etc.
They are in cells A1:A12.
In the debugger the array, menuItemArray, loads correctly with all expected classes from the 'Classes' sheet.
The error I get is:
TypeError: Cannot find function addSubMenu in object 9p1. (line 13,
file "Code")
This is when stepping into the line
menuItemArrayClass = menuItemArray [menuCount]
I would be really grateful for any help as to what I am doing wrong or any better ways to do it.
Here is my code:
function onOpen(e) {
var ui = SpreadsheetApp.getUi();
var menuCount = 0;
ui.createMenu('Manage Timetable')
.addItem('First item', 'menuItem1')
.addSeparator()
var menuItemArray = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Classes').getDataRange().getValues();
for (menuCount=1;menuCount < menuItemArray.length;++menuCount) {
var menuItemArrayClass = []
menuItemArrayClass = menuItemArray [menuCount]
.addSubMenu(ui.createMenu('Manage Classes')
.addItem(menuItemArrayClass [menuCount] + 'Schedule Timetable', 'runBatch1'))
.addToUi();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
myFunction()
)。我明白了上面的内容。如果我的理解是正确的,那么这个答案呢?请将其视为几个可能的答案之一。
问题和解决方法:
不幸的是,在当前阶段,使用
AddItem
方法将函数添加到自定义菜单时,无法使用该参数。当运行自定义菜单中的功能之一时,无法检索有关运行的函数名称的信息。这样,您的目标是无法直接实现的。因此,需要使用解决方法。当我看到您的问题时,出于您的目标,我认为此线程很有用。在Google.script.run上,需要能够在脚本编辑器上直接运行该功能,并且该功能包含在
this
中。但是在自定义菜单上,当功能包含在此
中时,即使无法直接在脚本编辑器上运行该函数,也可以运行该函数。当功能仅在气体侧运行时,即使无法直接使用脚本编辑器直接运行函数,函数也可以运行。我认为这种情况可用于解决方法。修改后的脚本:
通过包括此解决方法来修改您的脚本时,如下所示。请复制并将其粘贴到包含容器的电子表格脚本上,该脚本在第一行中带有标题(“ Col1”,“ Col2”,“ Col2”,以及第二行的值。当您运行脚本时,请打开电子表格。这样,添加了自定义菜单。当通过复制添加新列时,还将附加列添加到自定义菜单中。当运行自定义菜单上的功能时,激活了与列相对应的值。
来自:
到:
onChange()
的功能。这样,删除列后,自定义菜单将更新。函数oneDit(){}
和函数onChange(){}
的功能用于运行onopen();
。结果:
注意:
onopen();
。参考:
myFunction()
for several functions in the custom menu.I understand like above. If my understanding is correct, how about this answer? Please think of this as just one of several possible answers.
Issue and workaround:
Unfortunately, in the current stage, when a function is added to the custom menu with
addItem
method, the argument cannot been able to be used. And when one of functions in the custom menu is run, the information about the function name which was run cannot be retrieved. By this, your goal cannot be directly achieved. So it is required to use the workaround.When I saw your question, for your goal, I thought that this thread is useful. At google.script.run, it is required to be able to directly run the function at the script editor and the function is included in
this
. But at the custom menu, when the function is included inthis
, the function can be run even when the function cannot be directly run at the script editor. When the function is run in only GAS side, the function can be run even when the function cannot be directly run with the script editor. I thought that this situation can be used for the workaround.Modified script:
When your script is modified by including this workaround, it becomes as follows. Please copy and paste it to the container-bound script of Spreadsheet which has the headers ("Col1", "Col2",,,) at the 1st row and the values from 2nd row. And when you run the script, please open the Spreadsheet. By this, the custom menu is added. And when new column is added by copying, the additional column is also added to the custom menu. And when the function at the custom menu is run, the values corresponding to the column are activated.
From:
To:
onChange()
. By this, when the column is deleted, the custom menu is updated.function onEdit() {}
andfunction onChange() {}
are used for runningonOpen();
.Result:
Note:
onOpen();
.onOpen
is run every time. So when the number of columns are large, the process cost will be high. So please be careful this.References:
尝试以下试验:
如果您从1次松开第一行,所以我将其更改为0。
现在您需要动态分配脚本,但是我不知道它们在您的工作表中是如何设置的,所以我将那部分不变地离开了。
还不确定您是否每次都需要添加“管理类”菜单,但我将其保留为以防万一。
试试看,因为它看起来更像是您想要的:
Try this:
If you start from 1 you loose first row, so I changed it to 0.
Also now you need to dynamically allocate the scripts, but I do no know how they are set up in your sheet, so I left that part unchanged.
Also not sure if you need to add 'Manage Classes' menu every time, but I kept it just in case.
Try this instead as it seems more like what you want:
假设您想将相关字幕和函数名称存储在Sheet1列A&amp; b,您可以分别只需调用
.getValues(.getValues() /代码>
并通过该数据进行迭代。
在原始帖子中,发生错误是因为
。 Addsubmenu()
在值[9p1]
上被调用菜单对象。此外,从我对问题的理解中,我认为菜单 item 旨在在循环中创建一个菜单,而不是每个班级的单个子菜单。因此,这是需要解决的两个问题。我还假设您不想为每个菜单项运行
runbatch1
,因为这会破坏创建不同菜单项的目的。根据 document>,添加菜单项的方法期望两个字符串:字幕
- &nbsp;菜单项的标签。functionName
- 用户选择项目时要调用的函数的名称。因此,在制作
cumbenu.additem()
调用时,您可以替换任何字符串。其他方案
数组的对象的数组
也可以定义要包含的各种子菜单项目的数组(或对象映射),而不是将它们存储在电子表格中。在这里,我使用了一系列对象来清楚地定义标题&amp;函数名值。
字幕&nbsp;字符串操作
由于该方法接受任何字符串,因此您可以执行任何会导致有效函数名称的字符串操作。在此示例中,我只是将字幕存储在数组中,然后根据字幕值动态生成函数名称。 (您也可以从A列中摘取标题名称并应用相同的操作。)
Assuming you wanted to store the relevant captions and function names in Sheet1 columns A & B, respectively, you could simply call
.getValues()
and iterate through that data.In the original post, the error was happening because
.addSubMenu()
was being called on the value[9p1]
instead of a Menu object. Further, from my understanding of the question, I think a menu item is intended to be created in the loop, not an individual submenu for each class. So those are two problems that needed to be resolved.I also assume that you don't want to run
runBatch1
for every single menu item as that would defeat the purpose of creating different menu items. According to the documentation, the method for adding a menu item expects two strings:caption
– The label for the menu item.functionName
– The name of the function to invoke when the user selects the item.So it follows that you can substitute any string when making your
submenu.addItem()
call.Other Scenarios
Array of Item Objects
Alternatively, you could define an array (or object map) of the various submenu items you want to include, rather than storing them in the spreadsheet. Here, I've used an array of objects to clearly define the caption & functionName values.
Caption String Manipulation
Since the method accepts any string, you can perform any string manipulation that will result in a valid function name. In this example, I'm only storing the captions in an array and I dynamically generate the function names based on the caption values. (You could also pull the caption names from column A and apply the same manipulation.)