[英]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)
在我看来,它应该可以工作。 由于上面硬编码的测试触发器有效。 我在这里傻吗? 据我所知,这应该有效吗? 但事实并非如此。
当/如果我让它工作时,我会检查没有主题的“垃圾”草稿。 只是想让它现在真正起作用。
参数:
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>
它能做什么?
创建一个自定义菜单,该菜单将根据草稿显示一个对话框。html
在 draft.html 中,我们使用google.script.run.withSuccessHandler(function)在我们的服务器端(应用程序脚本)调用getDraftSubject()
,它返回了一组草稿消息主题。 然后我们更新表单的select
class 并根据获得的每个草稿消息主题添加选项。
提交表单后,它将调用handleFormSubmit()
,我们获取选定的草稿消息主题并使用google.script.run.myFunction(...) (任何服务器端函数)传递该值。
google.script.run.sendEmails(value);
Output:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.