【发布时间】:2016-01-15 22:31:04
【问题描述】:
我编写了一个脚本,在本机电子表格中使用时效果很好。我现在正在尝试将其作为附加组件发布,并且发现 onEdit(e) 无法正常工作,而 onOpen(e) 和 onInstall(e) 工作正常。
我查看了有关授权模式和安装/启用插件的文档,但我认为我可能遗漏了一些东西(希望是直截了当的),因为我是初学者。我应该以不同的方式调用函数吗?还是onEdit 的位置?任何帮助表示赞赏。谢谢!!
function setup() {
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Send Auto Emails');
try {ss.setActiveSheet(ss.getSheetByName('Send Auto Emails'));}
catch (e) {ss.insertSheet('Send Auto Emails', 0);}
sheet.getRange(1, 1).setValue('Recipient Email Address');
//etc...
}
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = e.source.getActiveSheet();
var range = e.source.getActiveRange();
if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" | range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
Browser.msgBox(
'Alert',
'Feel free to change the title here to something more relevant to you. But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
Browser.Buttons.OK
);
}
if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto Emails") {
Browser.msgBox(
'Alert',
'Only add the email message body. "Hello, Recipient Name" and "Best, Your Name" will be automatically added. If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
Browser.Buttons.OK
);
}
if (range.getA1Notation() == "A2") {
ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
}
}
function onOpen(e) {
var ui = SpreadsheetApp.getUi();
ui.createMenu('BulkEmail beta')
.addItem('1. Sheet Setup', 'setup')
.addItem('2. Send Emails', 'sendEmails')
.addToUi();
onEdit(e);
}
function onInstall(e) {
onOpen(e);
}
编辑 1
我尝试创建一个可安装的触发器而不是使用简单的onEdit,但仍然无济于事。
function createonEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ScriptApp.newTrigger('installableonEdit')
.forSpreadsheet(ss)
.onEdit()
.create();
}
function installableonEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = e.source.getActiveSheet();
var range = e.source.getActiveRange();
try {
if (range.getA1Notation() == "C1" | range.getA1Notation() == "D1" | range.getA1Notation() == "E1" && sheet.getName() == "Send Auto Emails") {
Browser.msgBox(
'Alert',
'Feel free to change the title here to something more relevant to you. But be aware, if you would like to use an optional item, please make sure you are referencing it in your email message exactly as it appears here, wrapped in < and >. Example: <Optional Item 1>.',
Browser.Buttons.OK
);
}
if (range.getA1Notation() == "J4" && sheet.getName() == "Send Auto Emails") {
Browser.msgBox(
'Alert',
'Only add the email message body. "Hello, Recipient Name" and "Best, Your Name" will be automatically added. If you would like to use Optional Items in this message, see the example text to make sure you are using them the right way.',
Browser.Buttons.OK
);
}
if (range.getA1Notation() == "A2") {
ss.toast("Your data in column A must not be separated by any blank rows. Any data after a blank row will be ignored.", "Be aware", 90);
}
} catch(err) {
var errMsg = 'There was an error: ' + err +
+ " \n \n" +
'from the: onEdit function ' +
+ " \n \n" +
'The call stack is: ' + err.stack;
GmailApp.sendEmail('elisabeth@groupon.com', "error", errMsg);
}
}
【问题讨论】:
-
它可能被调用但因某些错误而失败。使用 Logger 服务记录函数中各个点的错误。另外检查它是否由于此处提到的限制而失败:developers.google.com/apps-script/guides/triggers
-
@SujayPhadke
Logger无法记录错误。 Stackdriver 的console将是一个对开发人员更加友好的工具(默认情况下,未捕获的错误会记录到 Stackdriver)。大多数(全部?)触发的函数都会因错误而静默失败(并将其记录到 Stackdriver)——只有用户显式执行的函数才会向用户显示错误消息。 -
我无法在测试时让简单的 onEdit() 触发器在 Sheets 插件中运行,即使只使用一行代码:Logger.log("onEdit");我尝试了所有的 AuthModes,将项目分配给标准的 Cloud Platform 项目 ID,配置了 OAuth 屏幕,但均无济于事。如果我运行函数“onEdit()”它记录正常。我还尝试添加一个已安装的触发器,但在“事件源”下只有一个“日历”选项,它需要所有者的电子邮件地址,即使工作表和日历都在高级服务下和 appscript.json 下的“启用高级服务”下配置。有什么想法吗?
-
根据developers.google.com/gsuite/add-ons/how-tos/…,“测试时不支持可安装触发器。依赖于可安装触发器的功能不可测试”。不过,只要我不使用任何需要授权的代码,似乎简单的触发器在测试时应该可以工作……但是 Logger 不会记录,developers.google.com/apps-script/guides/triggers/#onedite 也不起作用。
标签: google-apps-script google-sheets triggers google-apps-script-addon