关于javascript:Google Apps脚本-运行自定义功能的自定义菜单

Google apps script - Custom menu to run custom funtion

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

令我难以理解的是:我有一个Google表格,其中包含5个单独的表格,一个Master和4个单独的表格。我为此编写了一个"发送电子邮件"功能,该功能可以按预期工作,并且在4张纸中的每张纸中的某个特定框包含"是"时触发。

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

1
2
3
4
5
6
7
8
9
10
11
12
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()绑定到该函数,则菜单消失:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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!');
    }
}

因此,我的问题有两个:

  • 我的菜单在哪?

  • 将功能绑定到触发器之后,如何将菜单项绑定到脚本?似乎我应该能够在上面的If语句下说"在这里做东西"。我说错了吗?

  • 谢谢你的想法! (我保证我会更好:)


    只需清楚一点,就onOpen()功能而言,不应从菜单中选择任何可安装的触发器,因为它已经是触发器。

    编写完函数并希望测试选项后,首先需要运行它。 您可以通过以下两种方式执行此操作:

  • 重新加载电子表格(请注意,这将关闭脚本选项卡!)
  • 运行onOpen()函数
  • 请注意,一旦运行了添加菜单的功能,则仅在更改菜单本身时才需要重新运行它。 如果您对menuItem1()进行了更改,则无需重新运行onOpen(),因为菜单选择仍将运行脚本中最新保存的代码。

    阅读注释,我将第二次引用Zig Mandel,如果您沿这条路线使用菜单来启动功能,则无需onEdit触发器,因为它们具有完全相同的目的—启动数据收集。