
本文讲解如何修正 google sheets 脚本中因未校验目标工作表而导致的时间戳误写问题,确保仅当“verify”表的第9列被编辑时,才在对应行第11列写入首次时间戳。
原始脚本的核心缺陷在于:它始终将 sh 变量固定指向 "Verify" 工作表,但后续判断仅检查了编辑列(col == 9)和目标单元格是否为空,完全忽略了编辑实际发生在哪张表上。因此,只要任意工作表(如 "Example Sheet")第9列某行被编辑,脚本就会获取该行号 row,然后去 "Verify" 表的同一行第11列写入时间戳——这正是您观察到“跨表误打时间戳”的根本原因。
要实现精准响应,必须同时满足三个条件:
- 编辑发生在第9列(col === 9);
- 编辑发生在名为 "Verify" 的工作表上(e.source.getActiveSheet().getName() === 'Verify');
- 目标时间戳单元格(第11列同行列)当前为空(保证“首次编辑”逻辑)。
以下是修复后的完整脚本:
多淘铺是一个淘宝店铺导航程序,是新淘客时代崛起的新型淘客程序,具有多功能易操作·多模式·高效率·高转化等特点,基于Smarty模板引擎,制作/修改模板变得简单 程序定位为淘宝店铺导航模式,店铺可自由添加/编辑等操作,采用ajax无刷新技术获取店铺信息。 运行环境:空间30M 以上 + PHP5.2.x多淘铺淘宝店铺导航系统 v1.5
function onEdit(e) {
var sh = e.source.getActiveSheet(); // ✅ 动态获取当前编辑的工作表
var row = e.range.getRow();
var col = e.range.getColumn();
// ✅ 仅当编辑发生在 "Verify" 表且是第9列时继续
if (col === 9 && sh.getName() === 'Verify') {
var stampCell = sh.getRange(row, 11); // 获取本表第11列对应单元格
if (!stampCell.getValue()) { // ✅ 检查本表该单元格是否为空
var tz = e.source.getSpreadsheetTimeZone();
var date = Utilities.formatDate(new Date(), tz, 'dd-MM-yyyy hh:mm:ss');
stampCell.setValue(date);
}
}
}⚠️ 关键注意事项:
- e.source.getActiveSheet() 是动态的,确保所有逻辑基于用户正在编辑的实际工作表;
- sh.getRange(row, 11) 中的 sh 是当前活动表,因此时间戳只会写入“Verify”表自身对应位置,不会跨表污染;
- 时间戳格式 'dd-MM-yyyy hh:mm:ss' 使用 12 小时制(含 hh),如需 24 小时制,请改用 'dd-MM-yyyy HH:mm:ss'(注意大写 HH);
- 此函数依赖 onEdit 触发器,属于简单触发器,无需授权即可运行,但不可调用需授权的服务(如发送邮件);
- 手动清空时间戳后,下一次编辑第9列将重新生成新时间戳——符合您“每日手动重置”的需求。
通过这一修正,脚本逻辑真正实现了“所见即所得”:只有在 "Verify" 表第9列被编辑的那一刻,其同行第11列才会被安全、唯一地打上时间戳。









