Я написал сценарий, который отлично работает при использовании в собственной электронной таблице. Сейчас я пытаюсь опубликовать его как надстройку и обнаружил, что 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('[email protected]', "error", errMsg);
}
}
Logger
не может записывать ошибки. Stackdriverconsole
будет гораздо более удобным инструментом для разработчиков (неотловленные ошибки по умолчанию регистрируются в Stackdriver). Большинство (все?) запускаемых функций будут молча завершаться с ошибкой (и записывать ее в Stackdriver) - только явно выполняемые пользователем функции будут отображать сообщение об ошибке обратно пользователю. - person tehhowch   schedule 17.08.2018