【问题标题】:Google apps script - Custom menu to run custom funtion谷歌应用脚​​本 - 自定义菜单运行自定义功能
【发布时间】:2017-01-23 22:44:22
【问题描述】:

我在这个项目上发布了很多次,非常感谢我收到的帮助:)

有些事情让我无法理解:我有一个 Google 表格,其中包含 5 个单独的表格、一个主表格和 4 个单独的表格。我为它编写了一个“发送电子邮件”功能,它按预期工作,并在 4 个单独工作表中的每个工作表中的某个框包含“是”时触发。

我的问题围绕着将此脚本绑定到触发器。我收到了以前的建议,即创建一个自定义菜单,在选择时触发脚本。我能够添加菜单,将其绑定到一个简单的 onOpen() 触发器,并让它出现在工作表中,但它不会运行我的脚本:

function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Send Emails')
  .addSubMenu(ui.createMenu('Send Emails For:')
              .addItem('Miranda Sheet', 'menuItem1')
              .addItem('Piper Sheet', 'menuItem2')
              .addItem('Lowes Sheet', 'menuItem3')
              .addItem('Golden Sheet', 'menuItem4'))
.addToUi();
}
//actions for menu items are below...

脚本的目的是发送电子邮件,所以我现在知道我要将菜单与可安装的 onOpen() 触发器联系起来。那是我似乎无法确定的部分。如果我更改函数名称并通过资源>所有触发器将 onOpen() 绑定到该函数,我的菜单就会消失:

function addMenu() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('Send Emails')
  .addSubMenu(ui.createMenu('Send Emails For:')
    .addItem('Miranda Sheet', 'menuItem1')
    .addItem('Piper Sheet', 'menuItem2')
    .addItem('Lowes Sheet', 'menuItem3')
    .addItem('Golden Sheet', 'menuItem4'))
.addToUi();
}

function menuItem1() {
    var ui = SpreadsheetApp.getUi();
    //Prompt user for confirmation to send emails
    var responseMir = ui.alert('Are you sure you want to send emails?', ui.ButtonSet.YES_NO);
    // Process the user's response.
    if (responseMir === ui.Button.YES) {
      //Test alert  
      //ui.alert('You clicked the first menu item!');
    }
}

所以,我的问题有两个:

  1. 我的菜单呢?

  2. 在函数绑定到触发器后,如何将菜单项绑定到我的脚本?似乎我应该能够在上面的 If 语句下说“在这里做事”。我错了吗?

感谢您的想法! (我保证会好起来的:)

【问题讨论】:

  • 当最终用户选择 Miranda Sheet 时,函数menuItem1() 中的任何代码都会运行。基本上菜单项启动该功能,因此您在第 2 项上是正确的。您将调用一个函数来发送电子邮件,传递特定于 tje Miranda Sheet 的项目。
  • 我建议保留通过 onOpen() 在简单触发器中定义的菜单。查看Installable Triggers的限制
  • 好的,所以我需要让每个菜单项函数从单个工作表中收集所需的信息,然后调用定义的 sendEmails() 函数,将数据传递给它,然后发送关闭电子邮件?我不是必须将该函数绑定到可安装的 onEdit() 吗?
  • 没有。 onEdit 不相关。请参阅模板的官方“创建菜单”帮助部分。
  • 另一件事。你有一个名为 onOpen() 的函数以及定义的触发器吗?如果是这样,那可能会导致问题。

标签: javascript function google-apps-script google-sheets


【解决方案1】:

为了清楚起见,对于onOpen() 函数,应该没有从菜单中选择可安装的触发器,因为它已经是触发器了。

一旦编写了函数并且您希望测试选项,您首先需要运行它。您可以通过两种方式做到这一点:

  1. 重新加载电子表格(请注意,这将关闭您的脚本选项卡!)
  2. 运行onOpen()函数

请注意,一旦您运行了添加菜单的功能,您只需在更改菜单本身时重新运行它。如果您对menuItem1() 进行了更改,则无需重新运行onOpen(),因为菜单选择仍会运行脚本中最新保存的代码。

阅读 cmets 我将支持 Zig Mandel,如果您通过这条路线使用菜单来启动功能,则不需要 onEdit 触发器,因为它们的用途完全相同 - 启动数据收集。

【讨论】:

  • 谢谢!我想我的印象是,如果我使用任何触发器,它必须是可安装的,因为简单的触发器不能发送电子邮件。但从我从这里的 cmets 那里收集到的信息来看,情况并非如此。使用一个简单的菜单触发器,让菜单项函数收集数据,然后将其传递给发送电子邮件的函数就可以正常工作,对吗?
  • @Jensen010 所有简单的onOpen() 所做的就是添加菜单。单击菜单中的条目后,它与进入脚本编辑器并单击选择该功能的运行相同。这就是为什么只编辑函数后,您不需要重新运行onOpen,除非您删除或重命名现有函数或添加新函数。 onOpen() 只是确保每当您打开电子表格时,您都会看到该菜单,仅此而已(除非您告诉它执行其他操作)
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多