谷歌表格脚本求助:录入完成日期发管理员邮件后自动删除对应行
修改后的完整脚本
function processCompletedQuotes() { var ActiveSheet = SpreadsheetApp.getActive().getSheetByName('Quoting'); var StartRow = 2; var lastRow = ActiveSheet.getLastRow(); // 完成日期录入列的索引,列号从0开始计数,假设你把完成日期放在第9列(表格显示的第9列,对应索引8),位置不对可自行调整 var COMPLETION_DATE_COL = 8; // 替换为实际的管理员收件邮箱 var ADMIN_MAIL = "admin@example.com"; // 改用倒序循环,避免删行后行号偏移导致删错数据 for (var i = lastRow; i >= StartRow; i--) { var CurrentRow = ActiveSheet.getRange(i, 1, 1, 11).getValues()[0]; var completionDate = CurrentRow[COMPLETION_DATE_COL]; var emailStatus = CurrentRow[7]; // 判断逻辑:完成日期不为空、且未发送过完成通知才处理 if (!completionDate || /^Completion Email sent/.test(emailStatus)) { continue; } var endDate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy"); var message = "该报价项目已完成:" + "<p><b>项目编号:</b>" + CurrentRow[1] + "</p>" + "<p><b>建造商:</b>" + CurrentRow[2] + "</p>" + "<p><b>报价人:</b>" + CurrentRow[3] + "</p>" + "<p><b>截止日期:</b>" + CurrentRow[4] + "</p>" + "<p><b>备注:</b>" + CurrentRow[5] + "</p>"; var Subject = "报价项目已完成"; // 先给管理员发通知邮件 MailApp.sendEmail(ADMIN_MAIL, Subject, message, { htmlBody: message }); // 标记发送状态 ActiveSheet.getRange(i, 8).setValue("Completion Email sent " + endDate); // 删除当前行 ActiveSheet.deleteRow(i); } }
核心调整说明
- 遍历逻辑改为倒序:从表格最后一行向上遍历,删除行后不会影响未处理行的行号,彻底避免删错数据的问题
- 新增完成日期判断:默认假设完成日期录入在表格第9列(对应索引8),如果你的完成日期放在其他列,修改
COMPLETION_DATE_COL的数值即可(索引=表格列号-1) - 优化发送状态校验:只要状态列已有发送标记就自动跳过,不会重复发邮件
- 补充删行逻辑:邮件发送成功后直接删除当前处理行
使用提示
- 替换代码中的
admin@example.com为实际管理员收件邮箱 - 可在脚本编辑器的「触发器」页面新增自动触发规则,选择
processCompletedQuotes函数,触发条件设置为「电子表格变更时」,这样只要有人录入完成日期就会自动执行对应逻辑 - 首次运行需要按照提示授权脚本的表格编辑、邮件发送权限
内容的提问来源于stack exchange,提问作者banksie
相关产品推荐
相关产品推荐

