Google Sheets脚本优化:仅指定工作表由脚本编辑时触发邮件告警
解决Google Sheets脚本仅在Washouts工作表被脚本写入时触发邮件告警的问题
方案一:直接在数据复制脚本中触发邮件(推荐)
既然仅当mergeAndClearRows()脚本将数据写入Washouts工作表时需要告警,最可靠的方式是在脚本完成数据复制后直接调用邮件发送逻辑,完全避开手动编辑的触发场景。
- 先创建一个独立的邮件告警函数(方便维护):
function sendWashoutAlert(rowData) { var recipientEmail = 'myemailaddyhere'; var subject = '新卡车清洗任务告警'; // 格式化告警消息,可根据你的列数据调整内容 var message = '有新的卡车需要清洗,详情:\n'; message += '------------------------\n'; message += '卡车编号:' + rowData[0] + '\n'; message += '任务日期:' + rowData[1] + '\n'; message += '关联单号:' + rowData[3] + '\n'; message += '------------------------\n'; MailApp.sendEmail(recipientEmail, subject, message); }
- 修改
mergeAndClearRows()脚本,在复制数据到Washouts后调用告警函数:
function mergeAndClearRows() { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); var rowIdx = sheet.getActiveRange().getRowIndex(); var rowValues = sheet.getRange(rowIdx, 1, 1, sheet.getLastColumn()).getValues(); // Checkbox column is currently U (adjust if I do move to the end) var checkboxValue = rowValues[0][20]; // Column U (index 20) // Initialize destValues array var destValues = [ rowValues[0][0], rowValues[0][1], rowValues[0][2], rowValues[0][3], rowValues[0][4], rowValues[0][5], rowValues[0][6], rowValues[0][7], rowValues[0][8], rowValues[0][9], rowValues[0][10], rowValues[0][11], rowValues[0][12], rowValues[0][13], rowValues[0][14], rowValues[0][15], rowValues[0][16], rowValues[0][19] ]; // second copy for washouts if box is checked if (checkboxValue === true) { var destWashouts = spreadsheet.getSheetByName('Washouts'); destWashouts.getRange(destWashouts.getLastRow() + 1, 1, 1, destValues.length).setValues([destValues]); // 新增:发送清洗告警邮件 sendWashoutAlert(destValues); // Set value column Q sheet.getRange(rowIdx, 17).setValue(false); } // Completed Loads if U = false var destCompletedLoads = spreadsheet.getSheetByName('Completed Loads'); destCompletedLoads.getRange(destCompletedLoads.getLastRow() + 1, 1, 1, destValues.length).setValues([destValues]); // Clear content var rangeToClear = sheet.getRange(rowIdx, 9, 1, 7); rangeToClear.clearContent(); // Clear U sheet.getRange(rowIdx, 21).setValue(false); // Clear content in column T (index 20) regardless of checkbox status sheet.getRange(rowIdx, 20).clearContent(); }
完成后可以删除原有的sendEmailOnEdit()函数及对应的触发器,仅保留上述脚本即可。
方案二:修改onEdit触发器区分脚本/手动编辑
如果坚持使用触发器,可通过事件对象的e.user属性判断:手动编辑时e.user会返回当前用户邮箱,脚本编辑时e.user为null。修改后的sendEmailOnEdit()代码如下:
function sendEmailOnEdit(e) { const targetSheetName = "Washouts"; const activeSheet = e.source.getActiveSheet(); // 过滤非目标工作表的编辑 if (activeSheet.getName() !== targetSheetName) return; // 过滤手动编辑(仅保留脚本触发的编辑) if (e.user !== null) return; // 获取写入的整行数据并格式化消息 const editedRow = activeSheet.getRange(e.range.getRow(), 1, 1, activeSheet.getLastColumn()).getValues()[0]; const recipientEmail = 'myemailaddyhere'; const subject = '新卡车清洗任务告警'; const message = 'Washouts工作表由脚本写入新数据:\n' + editedRow.join(', '); MailApp.sendEmail(recipientEmail, subject, message); }
注意:该方案依赖e.user的判断逻辑,极少数特殊场景(如API调用触发的脚本)可能出现偏差,因此方案一更稳妥。
内容的提问来源于stack exchange,提问作者Jonathan Nolan
相关产品推荐
相关产品推荐

