繁体   English   中英

Google Apps 脚本 - 工作表 - 菜单触发器不起作用

[英]Google Apps Script - Sheet - Menu Trigger not working

所以我正在构建一个邮件合并工具,它工作正常。

使用硬编码输入测试触发器可以正常工作:

function test(){
  sendEmails("TEST MAILMERGE FROM DRAFT")
}

如果我提示输入框(显示的代码的相关部分),它也可以正常工作。

function sendEmails(subjectLine,sheet=SpreadsheetApp.getActiveSheet()) {
  if (!subjectLine) {
    subjectLine = Browser.inputBox(
      "Mail Merge",
      "Type or copy/paste the subject line of the Gmail " +
        "draft message you would like to use:",
      Browser.Buttons.OK_CANCEL
    );

    if (subjectLine === "cancel" || subjectLine == "") {
      // if no subject line finish up
      return;
    }
  }

但是,尝试成为聪明的裤子并让菜单动态填充主题行,如下所示:

function onOpen() {
  // get the UI for the Spreadsheet
  const ui = SpreadsheetApp.getUi(); 
  
  // add the menu
  const menu = ui.createMenu("TEST"); 
  
  // get the drafts from Gmail
  let drafts = GmailApp.getDraftMessages(); 
  
  // for each draft, create a new menu item
  drafts.forEach((draft) => {
    // add the drafts to be triggered using the following: addItem(caption: string, functionName: string)
    menu
      .addItem(
        draft.getSubject().toString(),
        'sendEmails("' + draft.getSubject().toString() + '")'
      )
      .addToUi();
  });
}

但是,这不起作用。 它出现以下错误:

找不到错误脚本 function:sendEmails(TEST MAILMERGE FROM DRAFT)

在我看来,它应该可以工作。 由于上面硬编码的测试触发器有效。 我在这里傻吗? 据我所知,这应该有效吗? 但事实并非如此。

当/如果我让它工作时,我会检查没有主题的“垃圾”草稿。 只是想让它现在真正起作用。

Menu.addItem(标题,功能名称)

参数:

  • caption :菜单项的 label,只有第一个单词大写。
  • functionName :用户选择项目时要调用的 function 的名称。 您可以使用包含的库中的函数,例如 Library.libFunction1。

Menu.addItem()需要一个没有 arguments 的 function 名称。 它不允许在 function 中传递 arguments。


解决方法:

根据我的理解,您的目标是拥有一个不同的菜单项,该菜单项可以针对您 email 帐户中可用的每个草稿消息发送电子邮件。

您可能需要考虑使用自定义对话框自定义侧边栏,您可以在其中 select 您希望在调用sendEmails() function 时作为参数传递的草稿消息主题。 您可以参考示例代码作为参考。

示例代码:

(代码.gs)

function onOpen() {
  // get the UI for the Spreadsheet
  const ui = SpreadsheetApp.getUi(); 
  
  // add the menu
  const menu = ui.createMenu("TEST")
    .addItem('Send Email', 'selectDraft') 
    .addToUi();

}

function selectDraft() {

  var html = HtmlService.createHtmlOutputFromFile('draft');
  SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .showModalDialog(html, 'Select Draft Message');
}

function getDraftSubject(){
    
  // get the drafts from Gmail
  let drafts = GmailApp.getDraftMessages(); 
  var subjects = [];
  // for each draft, create a new menu item
  drafts.forEach((draft) => {
    subjects.push(draft.getSubject().toString());
  });
  Logger.log(subjects);
  return subjects;
}

function sendEmails(subjectLine,sheet=SpreadsheetApp.getActiveSheet()) {

  Logger.log(subjectLine);
}

(草案.html)

<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
  <h2>Select Draft Subject</h2>
  <form id="myForm" onsubmit="handleFormSubmit()">
    <div class="form-group">
        <label for="subject">Draft Subject</label>
        <select class="form-control form-control-sm" id="subject" name="subject" required>
          <option value="" selected>Choose...</option>
        </select>
      </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form> 

  
  <script>
  google.script.run.withSuccessHandler(function(subj) {
      let select = document.getElementById("subject");
      subj.forEach(function(e, i) {
        let option = document.createElement("option");
        option.value = e;
        option.text = e;
        select.appendChild(option);
      });
  }).getDraftSubject();

  
  function handleFormSubmit() {
    
    var value = document.getElementById("subject").value;
    google.script.run.sendEmails(value);
    document.getElementById("myForm").reset();
  }

</script>
</body>

它能做什么?

  1. 创建一个自定义菜单,该菜单将根据草稿显示一个对话框。html

  2. 在 draft.html 中,我们使用google.script.run.withSuccessHandler(function)在我们的服务器端(应用程序脚本)调用getDraftSubject() ,它返回了一组草稿消息主题。 然后我们更新表单的select class 并根据获得的每个草稿消息主题添加选项。

  3. 提交表单后,它将调用handleFormSubmit() ,我们获取选定的草稿消息主题并使用google.script.run.myFunction(...) (任何服务器端函数)传递该值。

    google.script.run.sendEmails(value);


Output:

在此处输入图像描述

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM