如何通过表格单元格控制时间驱动触发器的鸡蛋订单邮件发送?
当然可以通过表格控制脚本执行,同时也有更高效的部署方案,以下是具体实现方式:
一、表格控制脚本执行的实现
1. 表格配置方案
在对应摊位的工作表(比如NanaNick)中添加控制项,二选一即可:
- 复选框方案:在固定单元格(如
C9,表头行下方)插入复选框,勾选时触发本周停止订单的逻辑。 - 文本标记方案:在固定单元格(如
C9)输入STOP(不区分大小写),触发停止逻辑。
2. 核心逻辑修改
在原脚本开头加入控制判断,根据单元格值分支处理:
- 若触发停止条件:发送内容为「本周[摊位名]无需鸡蛋」的邮件,或直接跳过发送(按需选择)。
- 若未触发:正常发送订单表格邮件。
注意:原脚本中
if(i=0)是赋值操作,需修正为if(i === 0)(严格相等判断),避免表头渲染错误。
二、更优部署方式
1. 统一配置表管理多摊位
创建名为配置表的工作表,集中管理所有摊位的核心信息,避免重复编写函数:
| 摊位名称 | 收件邮箱 | BCC邮箱 | 订单数据范围 | 控制单元格 | 发送星期(1=周一,7=周日) |
|---|---|---|---|---|---|
| NanaNick | MrEggman@HenHousefarm.com | nananick@shopstall.com | A10:B17 | C9 | 2(周二) |
| AppleAndy | xxx@xxx.com | xxx@xxx.com | A10:B15 | C9 | 3(周三) |
2. 单触发器驱动全局逻辑
设置每周一次的时间驱动触发器(比如每周日晚),让函数自动判断当天星期几,匹配配置表中的发送规则,批量处理对应摊位。
3. 加入日志记录
通过Logger.log()记录每次执行状态(如「已发送NanaNick订单邮件」「已跳过AppleAndy:本周停止」),方便后续排查问题。
4. 使用安装型触发器
替换简单触发器为安装型触发器,确保脚本拥有稳定的邮件发送权限,避免手动/自动运行的权限差异导致报错。
三、修改后的完整脚本示例
function sendEggOrders() { var ss = SpreadsheetApp.getActive(); // 读取配置表数据 var configSheet = ss.getSheetByName("配置表"); var configData = configSheet.getRange(2, 1, configSheet.getLastRow()-1, 6).getValues(); // 转换当前星期为数字(1=周一,7=周日) var currentDay = new Date().getDay(); currentDay = currentDay === 0 ? 7 : currentDay; configData.forEach(function(config) { var stallName = config[0]; var toEmail = config[1]; var bccEmail = config[2]; var orderRange = config[3]; var controlCell = config[4]; var sendDay = config[5]; // 跳过非当天发送的摊位 if (sendDay !== currentDay) return; var stallSheet = ss.getSheetByName(stallName); if (!stallSheet) { Logger.log(`错误:未找到摊位工作表 ${stallName}`); return; } // 读取控制单元格值,兼容复选框(TRUE)和文本STOP var controlValue = stallSheet.getRange(controlCell).getValue().toString().trim().toUpperCase(); var isStop = controlValue === "TRUE" || controlValue === "STOP"; var emailSubj = `Egg Order to ${stallName} ${Utilities.formatDate(new Date(), "GMT+1:00", "dd.MM.yyyy")}`; var htmlBody; if (isStop) { // 生成停止订单邮件内容 htmlBody = `Hi Mr Eggman:<br><br>本周${stallName}无需鸡蛋`; Logger.log(`已发送停止订单邮件:${stallName}`); } else { // 生成正常订单表格 var orderValues = stallSheet.getRange(orderRange).getValues(); htmlBody = '<style>td,th{border:1px solid black;}</style><table>'; orderValues.forEach(function(row, idx) { htmlBody += '<tr>'; row.forEach(function(cell) { htmlBody += idx === 0 ? Utilities.formatString('<th>%s</th>', cell) : Utilities.formatString('<td>%s</td>', cell); }); htmlBody += '</tr>'; }); htmlBody += '</table>'; htmlBody = `Hi Mr Eggman:<br><br><br>${htmlBody}`; Logger.log(`已发送正常订单邮件:${stallName}`); } // 发送邮件 MailApp.sendEmail({ to: toEmail, subject: emailSubj, htmlBody: htmlBody, bcc: bccEmail }); }); }
四、设置步骤
- 在Google Sheets中创建
配置表,按上述格式填写所有摊位信息。 - 在每个摊位工作表的指定控制单元格添加复选框或输入
STOP文本。 - 打开脚本编辑器,替换原脚本为上述代码。
- 创建安装型触发器:
- 点击编辑器菜单「编辑」→「当前项目的触发器」。
- 点击「添加触发器」,设置:
- 函数选择:
sendEggOrders - 事件源:「时间驱动」
- 时间类型:「周计时器」
- 选择星期和时间(比如每周日23:00,确保周日数据已填写完成)
- 函数选择:
内容的提问来源于stack exchange,提问作者Nick Austin
相关产品推荐
相关产品推荐

