动态创建电子表格菜单项

2023-12-02

我正在尝试使用 Google Apps 脚本在 Google 表格中创建动态填充的菜单。

  1. 我有一张“课程”表,其中列出了我教授的课程。
  2. 在运行我的脚本时,我让脚本读取这些类并将其加载到数组中。
  3. 为了仅在原始“类”表中硬编码值,我想为每个类创建一个子菜单项。

该表称为“类”。 类表中的值为 8H、9p1、9p2 等。 它们位于单元格 A1:A12 中。 在调试器中,数组 menuItemArray 正确加载“类”表中的所有预期类。

我得到的错误是:

类型错误:在对象 9p1 中找不到函数 addSubMenu。 (第 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();
    }     
}

  • 您想要创建自定义菜单。
  • 您想要通过编辑电子表格来更新自定义函数。
  • 您想使用一个函数名称,例如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:

enter image description here

Note:

  • 为了动态创建自定义菜单,需要在函数运行的初始阶段运行该脚本。所以需要将其设置为全局的onOpen();.
  • 在此解决方法中,当函数运行时,onOpen每次都会运行。所以当列数较多时,工艺成本会很高。所以请小心这一点。
  • 这是一个简单的示例脚本,用于解释解决方法的一种方法。所以请根据您的情况修改此内容。

参考:

  • 自定义菜单
  • Different output in 3 anonymous function in GAS
    • 我认为这条线索对于思考 OP 的目标很有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态创建电子表格菜单项 的相关文章

随机推荐

  • ngModel 无法使用 contenteditable 处理

    我正在尝试绑定我的输入 该输入是包含 html 内容的字符串 app component ts 有 内容 变量 content string p This is my editable data p p Two way binding is
  • 将多列拆分为行[重复]

    这个问题在这里已经有答案了 我正在处理一组非常原始的数据 需要对其进行整理才能使用 我正在尝试根据分隔符拆分选定的列 d lt data frame id c 022 565 893 415 name c c e m q w w s e s
  • Selenium 测试在构建服务器上失败,并出现“服务器无响应”错误

    我在 VS2010 测试项目中有一个简单的 Selenium 测试 如下所示 TestMethod public void MyTestInIE8 IWebDriver driver new InternetExplorerDriver t
  • 从 Android 应用程序向 Google Assistant 发送命令

    为了提高效率 我想通过脚本从 Android 应用程序向 Google Assistant 发送常用命令 例如 好吧 谷歌 这是我用于从服务调用 Assistant 的代码 startActivity new Intent Intent A
  • 确定 Active Directory 搜索结果中用户的域[重复]

    这个问题在这里已经有答案了 可能的重复 如何从 AD DirectoryEntry 获取 DOMAIN USER 这是我现在所拥有的 DirectoryEntry de new DirectoryEntry LDAP domain Sear
  • 我们应该在链接的绝对路径中使用正斜杠 / 或反斜杠 \ 吗?

    所有这些链接的绝对路径都运行良好 img src alt img src alt img src alt 但我应该使用哪一个呢 推荐的是哪一款呢 它们之间有什么区别 URL 使用正斜杠 在所有平台上 反斜杠 用于 Windows 上的本地文
  • 如何确保一个事件只订阅一次

    我想确保我只在特定类中订阅实例上的事件一次 例如 我希望能够执行以下操作 if not already subscribed member Event new MemeberClass Delegate handler 我将如何实施这样的警
  • angularjs - 测试控制器

    我刚刚开始使用 Angular 我想为我的控制器编写一些简单的单元测试 这就是我得到的 app js use strict Declare app level module which depends on filters and serv
  • 一步步在 macOS 上编写 hello world

    我在 mac os x86 64 架构 的汇编方面遇到了很大的困难 我想向您介绍 hello world 程序的解释 如果您能向我提供反馈意见以及建议和解释 我将不胜感激 话虽如此 让我们进入代码 你好世界程序 Never felt the
  • 使用条件格式按类别交替设置数据格式

    我有一个电子表格 其中有很多行 如下所示 Name ID Category Attributes name0 753 cat1 name1 724 cat1 name2 149 cat1 name3 265 cat1 name4 032 c
  • 在 C 风格方法中访问实例变量

    有人可以确认您无法从同一类的 C 风格函数中访问 Objective C implementation 块中定义的实例变量吗 编译器抛出错误 提示 XXX 未声明 其中 XXX 是实例变量名称 这是我要解释的示例 interface Fon
  • 通过 Actionscript 3.0 使用 HTTP POST 上传 zip 文件

    我有一个 zip 文件 该文件是通过在桌面 Flex 4 6 应用程序中的视图上拖放而创建的 这会触发自动上传 zip 文件的服务 我可以使用以下代码将有关 zip 文件的元数据发送到服务器 var urlRequest URLReques
  • 在 Symfony 2.8、3.0 及更高版本中将数据传递给 buildForm()

    我的应用程序当前使用构造函数将数据传递到我的表单类型 如中所建议的这个答案 但是 那Symfony 2 8 升级指南建议将类型实例传递给createForm函数已弃用 将类型实例传递给 Form add FormBuilder add 和
  • Google Maps API v3 - infoWindows 均具有相同的内容

    我在使用 infoWindows 和 Google Maps API v3 时遇到了问题 最初 我遇到了其他人在打开新窗口时关闭 infoWindows 的问题 我想通过预先定义 infowindow 来解决这个问题 现在 当我单击新标记时
  • file_get_contents 脚本适用于某些网站,但不适用于其他网站

    我正在寻找构建一个 PHP 脚本来解析 HTML 中的特定标签 我一直在使用这个代码块 改编自这个tutorial 该脚本适用于某些网站 例如上面的 google 但是当我尝试使用其他网站 例如 freshdirect 时 我收到此错误 警
  • pyplot散点图标记大小

    在散点图的 pyplot 文档中 matplotlib pyplot scatter x y s 20 c b marker o cmap None norm None vmin None vmax None alpha None line
  • 我想在 React 的画布上录制视频

    我查了很久 觉得有必要在这里问一下 我之前使用的 npm 包什么也没做 有人曾经做过或经历过这样的应用吗 我想做的就是在画布元素上绘图时将其录制为视频 提前致谢 是的 您可以使用媒体流 捕获流 and 媒体记录器为了那个原因 下面是一个示例
  • VBA执行字符串中的代码

    我正在尝试执行字符串内的 vba 代码 而不将代码写入临时文件中 例如 Dim code As String code n 0 e i e 0 For e i e 0 To 100 n 1 Next 我尝试过 Eval Evaluate R
  • 如何更改行尾约定?

    我有一个我认为很简单的任务 我需要创建一个在行尾使用 unix LF 约定的文本文件 然而 当我尝试使用 pandas to csv 来完成此操作时 我最终得到了 CR LF 如果我留在我的机器上并且我使用 python 来处理所有事情 这
  • 动态创建电子表格菜单项

    我正在尝试使用 Google Apps 脚本在 Google 表格中创建动态填充的菜单 我有一张 课程 表 其中列出了我教授的课程 在运行我的脚本时 我让脚本读取这些类并将其加载到数组中 为了仅在原始 类 表中硬编码值 我想为每个类创建一个