多工作表通过复选框与脚本迁移行数据至指定表的实现问题
解决方案:扩展复选框迁移功能并避免数据覆盖
这里给你修改后的脚本,它支持所有以Ark+数字命名的工作表(比如Ark1、Ark2、Ark3...),并且会把数据追加到Sick工作表的末尾,完全不会覆盖原有数据:
function main(sheet, row) { const ss = SpreadsheetApp.getActiveSpreadsheet(); // 从当前触发的工作表中获取B、C列的行数据 const [v, d] = sheet.getRange(`B${row}:C${row}`).getValues()[0]; const sickSheet = ss.getSheetByName('Sick'); const timeZone = ss.getSpreadsheetTimeZone(); // 格式化当前时间 const currentTime = Utilities.formatDate(new Date(), timeZone, 'HH:mm:ss dd-MM-yyyy'); // 追加数据到Sick表的最后一行(核心修改:避免覆盖) sickSheet.appendRow([currentTime, v, d]); } function onEdit(e) { const range = e.range; const sheet = range.getSheet(); const sheetName = sheet.getSheetName(); // 匹配所有以Ark开头、后面跟数字的工作表(比如Ark1、Ark2、Ark3) if (/^Ark\d+$/.test(sheetName) && e.value === "TRUE") { main(sheet, range.rowStart); // 取消复选框勾选状态 range.uncheck(); } }
关键修改说明:
支持多Ark工作表:
原来的代码只固定判断Ark1,现在用正则表达式/^Ark\d+$/匹配所有符合Ark+数字命名规则的工作表,不管你新增Ark4、Ark5都能自动适配。避免数据覆盖:
原来的代码是直接把数据写入Sick表的第row行(和触发行号相同),这会导致不同工作表的同号行数据互相覆盖。现在改用sickSheet.appendRow()方法,它会自动找到Sick表的最后一行,把新数据追加在后面,完美解决覆盖问题。优化参数传递:
修改了main函数的参数,直接传入触发的工作表对象,不需要再通过工作表名重复获取,让代码更高效简洁。
使用注意:
- 确保你的新增工作表命名严格遵循
Ark+数字的格式(比如Ark2、Ark3,不要写成Ark_2或者ark1,大小写敏感)。 - 如果需要支持其他命名格式的工作表,只需要修改正则表达式即可,比如要支持Ark开头加任意字符,可以改成
/^Ark.+/。
内容的提问来源于stack exchange,提问作者Jesper Homann
相关产品推荐
相关产品推荐

