Google Sheets 实现数据录入1小时后自动锁定对应行的操作方法
实现方案:Google Sheets 录入满1小时自动锁行
步骤1:打开脚本编辑器
- 打开目标Google Sheets文件,点击顶部菜单栏「扩展程序」->「Apps 脚本」,进入脚本编辑页,删除默认生成的空函数。
步骤2:编写核心脚本
第一个函数:监听编辑事件,记录录入完成时间
你可以指定某一列用来隐藏存储行的编辑时间戳,下面示例中用第8列(H列)存储,可根据自己的表格结构修改列号:
function onEdit(e) { const sheet = e.source.getActiveSheet(); // 如需仅监控特定工作表,可加判断:if(sheet.getName() !== "你的目标工作表名") return; const editedRow = e.range.getRow(); // 存储时间戳的列号,按需修改 const timestampCol = 8; // 仅未记录过时间的行新增时间戳,避免重复覆盖 if (!sheet.getRange(editedRow, timestampCol).getValue()) { sheet.getRange(editedRow, timestampCol).setValue(new Date()); } }
第二个函数:定时检查并锁定到期的行
function lockOldRows() { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 替换为你的实际工作表名 const sheet = ss.getSheetByName("你的工作表名称"); // 和上方时间戳列号保持一致 const timestampCol = 8; const lastRow = sheet.getLastRow(); const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000); const timestamps = sheet.getRange(1, timestampCol, lastRow, 1).getValues(); // 保留表格所有者的编辑权限 const owner = Session.getEffectiveUser(); for (let i = 0; i < timestamps.length; i++) { const rowNum = i + 1; const editTime = timestamps[i][0]; // 跳过无时间戳、未到1小时、已经锁定的行 if (!editTime || editTime > oneHourAgo || sheet.getRange(rowNum, 1, 1, sheet.getLastColumn()).getProtections(SpreadsheetApp.ProtectionType.RANGE).length > 0) { continue; } // 锁定当前行 const protection = sheet.getRange(rowNum, 1, 1, sheet.getLastColumn()).protect(); protection.removeEditors(protection.getEditors()); protection.addEditor(owner); // 如需给其他管理员保留编辑权限,可加:protection.addEditor("管理员邮箱地址"); protection.setDescription(`第${rowNum}行录入满1小时自动锁定`); } }
步骤3:配置触发器
- 保存脚本项目,自定义命名即可,按照提示完成脚本访问表格的权限授权。
- 点击脚本编辑器左侧闹钟形状的「触发器」按钮,新增第一个触发器:
- 运行函数选择
onEdit - 事件来源选择「电子表格」
- 事件类型选择「编辑时」
- 保存并完成权限验证
- 运行函数选择
- 再新增第二个触发器,用来定时执行锁行逻辑:
- 运行函数选择
lockOldRows - 事件来源选择「时间驱动」
- 类型选择「小时计时器」
- 时间间隔选择「每1小时」
- 保存即可
- 运行函数选择
注意事项
- 时间戳列不要和现有数据列冲突,配置完成后可以右键隐藏该列,不影响协作者正常录入。
- 如需仅判定特定列编辑才算录入完成,可在
onEdit函数中加判断逻辑:if(e.range.getColumn() !== 你指定的列号) return; - 整个配置操作必须由表格所有者完成,否则锁行权限无法生效。
内容的提问来源于stack exchange,提问作者pakseboy lao
相关产品推荐
相关产品推荐

