问题
I'm trying to create pop-up and email notifications for when certain daily limits are exceeded on edit of the spreadsheet.
When the values relating to today's date exceed the limits and I run the script, both the pop-up and email notifications are sent. But when using the onEdit function, i.e editing the column defined in the edit range.. only pop-up notifications are raised and no emails are sent.
Does anyone know why the onEdit function would work for SpreadsheetApp.getUi().alert but not MailApp.sendEmail? And why it works when the code is run, but not onEdit?
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Lab Analysis');
// define edit range
var editRange = sheet.getActiveRange();
var editRow = editRange.getRow();
var editCol = editRange.getColumn();
var range = sheet.getRange("AG6:AG");
var rangeRowStart = range.getRow();
var rangeRowEnd = rangeRowStart + range.getHeight();
var rangeColStart = range.getColumn();
var rangeColEnd = rangeColStart + range.getWidth();
// if cells lie within the edit range, run the following script
if (editRow >= rangeRowStart && editRow <= rangeRowEnd
&& editCol >= rangeColStart && editCol <= rangeColEnd) {
// set today's date and store a date object for today
var date = ss.getSheetByName('Daily Process
Limits').getRange("B1").setValue(new Date()).getValue();
// get values in date range
var daterange = sheet.getRange("A6:A").getValues();
// iterate the values in the range object
for(var i=0; i<daterange.length; i++) {
// compare only month/day/year in the date objects
if (new Date(daterange[i]).setHours(0,0,0,0) ==
date.setHours(0,0,0,0)) {
// if there's a match, set the row
// i is 0 indexed, add 6 to get correct row
var today_row = (i+6);
var today_set = ss.getSheetByName('Daily Process
Limits').getRange("D1").setValue(today_row);
var today_fos_tac_f1 = sheet.getRange("AE"+today_row).getValue();
var today_fos_tac_f2 = sheet.getRange("AF"+today_row).getValue();
var today_fos_tac_pf = sheet.getRange("AG"+today_row).getValue();
// pop up notifications to operator
if (today_fos_tac_f1 > 0.3) {
SpreadsheetApp.getUi().alert('pop up notification content'); }
if (today_fos_tac_f2 > 0.3) {
SpreadsheetApp.getUi().alert('pop up notification content'); }
if (today_fos_tac_pf > 0.3) {
SpreadsheetApp.getUi().alert('pop up notification content'); }
// Set email addresses
var emails = ['emailaddress@gmail.com'];
// send email notification to site manager
if (today_fos_tac_f1 > 0.3) {
MailApp.sendEmail(emails, 'High FOS:TAC in Fermenter 1', 'email content');}
if (today_fos_tac_f2 > 0.3){
MailApp.sendEmail(emails, 'High FOS:TAC in Fermenter 2', 'email content');}
if (today_fos_tac_pf > 0.3){
MailApp.sendEmail(emails, 'High FOS:TAC in Post Fermenter', 'email content');}
}
}
}}
回答1:
I think the issue is that since simple triggers fire automatically without asking for authorization they cannot access services that require authorization. Reference
回答2:
I Agree with Cooper. You can wrap your code in a try and catch to see the error (code below) message.
You might be able to get around this be setting a time driven trigger. Let's say it is set to one minute and it looks at the data to check for the conditions you are looking for then sends an email if the conditions are met.
function onEdit(e) {
// Set email address
var emails = ['some@email.com'];
// send email notification to site manager
try{
MailApp.sendEmail(emails, 'High FOS:TAC in Fermenter 1', 'email content')
} catch (e){
Logger.log(e)
}
}
This is the logger error.
来源:https://stackoverflow.com/questions/48284675/mailapp-sendemail-not-working-with-onedit-function-google-sheets-script-editor