You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:15:03