Google Sheets复选框迁移数据时实现非刷新时间戳问题
解决Google Sheets迁移行时静态时间戳问题
问题背景
勾选复选框触发数据行在「EQUIPAMENTOS NO LABORATÓRIO」和「EQUIPAMENTOS LIBERADOS」两个工作表间迁移,原自定义函数setTimestamp生成的时间戳是易失性计算值,每次打开表格都会重新刷新,无法保留固定操作时间。需要将静态时间戳逻辑整合到onEdit迁移函数中,确保时间戳一旦生成就不再变化。
修改后的完整代码
function onEdit(event) { // COD ATUALIZADO 22/11/22 + 静态时间戳整合 var ss = SpreadsheetApp.getActiveSpreadsheet(); var s = event.source.getActiveSheet(); var r = event.source.getActiveRange(); // 从实验室工作表迁移至已释放工作表(勾选复选框) if(s.getName() == "EQUIPAMENTOS NO LABORATÓRIO" && r.getColumn() == 1 && r.getValue() == true) { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("EQUIPAMENTOS LIBERADOS"); var targetRow = targetSheet.getLastRow() + 1; var targetRange = targetSheet.getRange(targetRow, 1); // 迁移整行数据 s.getRange(row, 1, 1, numColumns).moveTo(targetRange); // 在目标行最后一列写入静态时间戳 targetSheet.getRange(targetRow, numColumns + 1).setValue(new Date()); // 删除原行 s.deleteRow(row); // 从已释放工作表迁移回实验室工作表(取消复选框) } else if(s.getName() == "EQUIPAMENTOS LIBERADOS" && r.getColumn() == 1 && r.getValue() == false) { var row = r.getRow(); var numColumns = s.getLastColumn(); var targetSheet = ss.getSheetByName("EQUIPAMENTOS NO LABORATÓRIO"); var targetRow = targetSheet.getLastRow() + 1; var targetRange = targetSheet.getRange(targetRow, 1); // 迁移整行数据 s.getRange(row, 1, 1, numColumns).moveTo(targetRange); // 在目标行最后一列写入静态时间戳 targetSheet.getRange(targetRow, numColumns + 1).setValue(new Date()); // 删除原行 s.deleteRow(row); } }
关键修改说明
替换易失性计算为静态写入:
原自定义函数依赖单元格自动计算触发,每次表格重新加载都会生成新时间。改用setValue(new Date())直接向单元格写入静态时间值,生成后不会随表格刷新变化。精准定位时间戳列:
通过numColumns + 1获取目标工作表的空白列(迁移行的右侧),确保时间戳不会覆盖已有数据。双向迁移统一处理:
对正向(实验室→已释放)和反向(已释放→实验室)迁移逻辑都添加了时间戳写入,确保所有迁移操作都能记录操作时间。
注意事项
- 确保目标工作表有足够的空白列容纳时间戳,避免数据覆盖;
- 该函数仅在手动编辑复选框时触发,不会因表格打开、自动计算等场景执行。
内容的提问来源于stack exchange,提问作者DimitryART
相关产品推荐
相关产品推荐

