Google Sheets两个onEdit触发脚本合并实现问题咨询
错误修正说明
你自行合并的版本存在3处核心问题:
first函数的入参是event,但代码中所有事件对象都调用了未定义的e,导致脚本触发时报错first函数中if (s.getName() !== 'Form')没有添加return终止逻辑,且判断逻辑写反:你原本是要限制行复制功能仅在Form工作表生效,却写了不等于Form才继续,会导致逻辑完全相反- 原时间戳脚本的
else分支没有包裹花括号,会导致清空Pasien列时仍尝试给日期列赋值,出现逻辑异常
正确合并后代码
function onEdit(e) { // 两个功能共享事件对象,避免重复取值 const activeSheet = e.range.getSheet(); const activeSheetName = activeSheet.getName(); // 仅在Form工作表触发两个功能,其他工作表直接终止 if (activeSheetName !== 'Form') return; // 调用行复制功能 handleRowCopy(e); // 调用时间戳功能 handleTimeStamp(e); } /** * 功能1:U列输入XX时复制行到目标工作表并清空指定列 */ function handleRowCopy(e) { const ss = e.source; const r = e.range; const actionCol = 21; // U列 const nameCol = 22; // V列 const rowIndex = r.getRow(); const colIndex = r.getColumn(); const colNumber = ss.getActiveSheet().getLastColumn() - 1; // 仅当修改的是U列且值为XX时执行逻辑 if (e.value !== "XX" || colIndex !== actionCol) return; const targetSheetName = ss.getActiveSheet().getRange(rowIndex, nameCol).getValue(); const targetSheet = ss.getSheetByName(targetSheetName); // 目标工作表不存在则终止 if (!targetSheet) return; // 复制行到目标工作表 const sourceRange = ss.getActiveSheet().getRange(rowIndex, 1, 1, colNumber); const targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, colNumber); sourceRange.copyTo(targetRange); // 清空指定列内容 const clearCols = [6, 7, 8, 12, 14, 16, 17, 19, 20, 21]; for (const col of clearCols) { ss.getActiveSheet().getRange(rowIndex, col).clearContent(); } } /** * 功能2:Pasien列修改时自动更新Tgl Keluar日期 */ function handleTimeStamp(e) { const timezone = "GMT+7"; const timeFormat = "dd-MM-yyyy"; const updateColName = "Pasien"; const timeStampColName = "Tgl Keluar"; const sheet = e.source.getSheetByName('Form'); const actRng = e.range; const editColumn = actRng.getColumn(); const rowIndex = actRng.getRow(); // 获取表头列索引 const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; const dateCol = headers.indexOf(timeStampColName); const updateCol = headers.indexOf(updateColName) + 1; // 不符合触发条件则终止 if (dateCol < 0 || rowIndex <= 1 || editColumn !== updateCol) return; const targetDateCell = sheet.getRange(rowIndex, dateCol + 1); // Pasien列为空则清空日期,否则写入当前日期 if (actRng.isBlank()) { targetDateCell.clearContent(); } else { const currentDate = Utilities.formatDate(new Date(), timezone, timeFormat); targetDateCell.setValue(currentDate); } }
使用说明
- 直接将上述代码替换你现有的所有代码即可,无需保留原来的多个onEdit函数
- 两个功能互不干扰,分别通过独立的条件判断触发,不会出现逻辑冲突
- 所有触发条件都添加了前置校验,不会出现空值报错、越界操作等异常
内容的提问来源于stack exchange,提问作者yoenoess
相关产品推荐
相关产品推荐

