3D打印表单追踪器邮件自动化:Apps Script触发器配置问题
解决Apps Script电子表格触发器不显示的问题
一、问题原因
你看不到电子表格触发选项,是因为触发器创建入口不对,且当前函数未适配电子表格事件的逻辑——默认从脚本编辑器的「触发器」入口创建时,若未指定事件源,只会显示通用的部署和时间驱动选项。
二、正确创建电子表格触发器的步骤
- 打开目标Google表格,点击顶部菜单栏「扩展程序」→「Apps Script」进入脚本编辑器
- 点击左侧时钟形状的「触发器」图标
- 点击右下角「添加触发器」按钮,在配置面板中设置:
- 选择要触发的函数(
checkFilamentThreshold或notifyPrintComplete) - 「事件源」选择「从电子表格」
- 「事件类型」按需选择:
- 若需表格编辑时触发,选「编辑时」
- 若针对表单提交(你的表格是表单响应表),选「表单提交时」
- 完成设置后点击「保存」,按提示完成权限授权即可
- 选择要触发的函数(
三、代码优化(避免重复发送邮件)
当前代码每次运行会遍历所有行,易导致重复发邮件。建议新增标记列记录发送状态,优化后代码如下:
优化后的耗材阈值提醒函数
function checkFilamentThreshold(e) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); var dataColumn = 9; // I列:剩余耗材 var emailColumn = 2; // B列:邮箱 var threshold = 150; // 阈值(克) var sentFlagColumn = 11; // K列:邮件发送标记(可自行调整列号) var startRow = 2; var endRow = sheet.getLastRow(); // 表单提交触发时,仅处理新增的一行 if (e && e.range) { startRow = e.range.getRow(); endRow = startRow; } for (var i = startRow; i <= endRow; i++) { var filament = sheet.getRange(i, dataColumn).getValue(); var email = sheet.getRange(i, emailColumn).getValue(); var hasSent = sheet.getRange(i, sentFlagColumn).getValue(); // 仅当耗材达阈值且未发送过邮件时执行 if (filament === threshold && hasSent !== "已发送") { var subject = "耗材已达阈值提醒"; var message = `您好, 您的3D打印剩余耗材已达${threshold}克,请及时采购PLA耗材以继续使用ECE工坊的打印服务。 也可以选择其他3D打印服务: - Bechtel创新中心 - 3D打印俱乐部 感谢您的使用, ECE工坊团队`; GmailApp.sendEmail(email, subject, message); // 标记已发送,避免重复触发 sheet.getRange(i, sentFlagColumn).setValue("已发送"); } } }
优化后的打印完成提醒函数
function notifyPrintComplete(e) { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); var printCompleteColumn = 10; // J列:打印完成状态 var emailColumn = 2; // B列:邮箱 var sentFlagColumn = 12; // L列:取件提醒发送标记(可自行调整列号) var startRow = 2; var endRow = sheet.getLastRow(); // 表单提交触发时,仅处理新增的一行 if (e && e.range) { startRow = e.range.getRow(); endRow = startRow; } for (var i = startRow; i <= endRow; i++) { var printComplete = sheet.getRange(i, printCompleteColumn).getValue(); var email = sheet.getRange(i, emailColumn).getValue(); var hasSent = sheet.getRange(i, sentFlagColumn).getValue(); if (printComplete === "Yes" && hasSent !== "已发送") { var subject = "3D打印完成,请取件"; var message = `您好, 您的3D打印任务已完成,可前往ECE工坊取件。 感谢您使用我们的3D打印服务! 此致, ECE工坊团队`; GmailApp.sendEmail(email, subject, message); sheet.getRange(i, sentFlagColumn).setValue("已发送"); } } }
四、关键注意事项
- 首次创建触发器需完成权限授权,按页面提示操作即可
- 针对表单响应表,优先选择「表单提交时」作为事件类型,减少不必要的遍历
- 需提前在表格中新增标记列(如K、L列),用于记录邮件发送状态
内容的提问来源于stack exchange,提问作者ECE Shop
相关产品推荐
相关产品推荐

