You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets脚本优化:仅指定工作表由脚本编辑时触发邮件告警

解决Google Sheets脚本仅在Washouts工作表被脚本写入时触发邮件告警的问题

方案一:直接在数据复制脚本中触发邮件(推荐)

既然仅当mergeAndClearRows()脚本将数据写入Washouts工作表时需要告警,最可靠的方式是在脚本完成数据复制后直接调用邮件发送逻辑,完全避开手动编辑的触发场景。

  1. 先创建一个独立的邮件告警函数(方便维护):
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);
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:47:27