Google Sheet用户编辑时避免重复发邮件的Google Script求助
脚本修改方案及问题说明
原代码核心问题
- 条件判断逻辑错误:原有判断仅在S3为
false且等于历史值时才终止执行,只要S3为true就会直接触发邮件发送,没有校验状态变化 - 属性存储方法调用错误:原有代码调用
getProperty()传入两个参数试图存储状态,该方法仅支持读取属性,需要用setProperty()才能写入状态,导致历史值永远不会更新,每次编辑都会触发邮件 - 代码块结构错误:
else后未正确包裹业务逻辑,导致邮件发送逻辑不受判断条件控制,无论判断结果如何都会执行 - 缺少状态变化校验:没有实现「仅当S3从
false变为true时才发邮件」的核心逻辑,状态不变或者从true变回false时都不应该发邮件
修改后代码
function sendEmail(e) { var sp = PropertiesService.getScriptProperties(); var errorTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Error'); // 获取S3当前值,统一转布尔值避免类型判断异常 var currentState = Boolean(errorTab.getRange('S3').getValue()); // 读取历史状态,默认无错误为false var oldState = sp.getProperty('S3') === 'true'; // 仅当错误状态从无到有(false→true)时才执行发信逻辑,其余情况直接返回 if (!(currentState === true && oldState === false)) { sp.setProperty('S3', String(currentState)); return; } // 组装邮件内容并发信 var dataRef = "Kindly Check " + errorTab.getRange('B3').getValue() + errorTab.getRange('H3').getValue() + errorTab.getRange('N3').getValue(); var option = { cc: "admin1@gmail.com", }; GmailApp.sendEmail( "admin@gmail.com", "Dating Contracts Email Notification for Error Tab", dataRef, option ); // 更新存储的最新状态 sp.setProperty('S3', String(currentState)); }
后续配置说明
- 触发器更新:如果之前使用的是简单onEdit触发器,没有Gmail发信权限,需要删除原有触发器,新增可安装的编辑触发器,绑定
sendEmail函数 - 权限授权:首次执行该脚本时需要按照提示完成权限授权,允许脚本访问表格和发送邮件
内容的提问来源于stack exchange,提问作者Mr. Explorer
相关产品推荐
相关产品推荐

