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

Google Apps Script onEdit函数添加OR条件后失效求助

问题原因分析

你的修改完全搞错了逻辑判断逻辑:

  • 原脚本中,tryInsertDate函数的逻辑是:仅当工作表是'test' 且 A列对应行等于目标值时,才执行插入
  • 修改后,你把条件改成了工作表不是'test' || A列≠val || B列≠val,这意味着只要A列和B列中有一个不等于传入的val,函数就直接返回。

举个实际执行的例子:
当调用tryInsertDate(e, 'c', 'In Progress')时,函数会检查B列的值是否等于"In Progress"——但B列是布尔值TRUE/FALSE,永远不可能等于字符串"In Progress",所以这个条件永远为真,函数直接返回,根本不会执行时间戳插入。同理,调用tryInsertDate(e, 'd', true)时,A列的值是文本,不可能等于布尔值true,同样直接返回。

修正方案

你需要让判断逻辑对应到正确的列,这里有两种清晰的修正方式:

方案1:给函数增加列参数(推荐)

修改tryInsertDate,让它接收要检查的列标识,这样就能分别对应A列和B列的判断:

function tryInsertDate(e, checkCol, rangeToSet, val) {
    const sheet = e.range.getSheet();
    // 检查工作表是否正确,且目标列的值等于指定值
    if (sheet.getName() !== 'test' || sheet.getRange(checkCol + e.range.rowStart).getValue() !== val ) {
        return;
    }
    sheet.getRange(rangeToSet + e.range.rowStart).setValue(new Date()).setNumberFormat('MM/dd/yyyy');
}

function onEdit(e) {
    // 检查A列是否为"In Progress",是则给C列插时间戳
    tryInsertDate(e, 'a', 'c', 'In Progress');
    // 检查B列是否为TRUE,是则给D列插时间戳
    tryInsertDate(e, 'b', 'd', true);
}

方案2:拆分逻辑,分别处理(更直观)

如果觉得多参数麻烦,也可以把两种判断分开写,逻辑更清晰,适合新手理解:

function onEdit(e) {
    const sheet = e.range.getSheet();
    if (sheet.getName() !== 'test') return;
    
    const row = e.range.rowStart;
    // 处理A列标记"In Progress"的情况
    if (sheet.getRange('a' + row).getValue() === 'In Progress') {
        sheet.getRange('c' + row).setValue(new Date()).setNumberFormat('MM/dd/yyyy');
    }
    // 处理B列标记TRUE的情况
    if (sheet.getRange('b' + row).getValue() === true) {
        sheet.getRange('d' + row).setValue(new Date()).setNumberFormat('MM/dd/yyyy');
    }
}
额外优化建议

频繁调用getRange会影响脚本性能,建议一次性获取整行数据再判断:

function onEdit(e) {
    const sheet = e.range.getSheet();
    if (sheet.getName() !== 'test') return;
    
    const row = e.range.rowStart;
    const rowData = sheet.getRange(row, 1, 1, 2).getValues()[0]; // 一次性获取A、B列的值
    const [colAVal, colBVal] = rowData;
    
    if (colAVal === 'In Progress') {
        sheet.getRange('c' + row).setValue(new Date()).setNumberFormat('MM/dd/yyyy');
    }
    if (colBVal === true) {
        sheet.getRange('d' + row).setValue(new Date()).setNumberFormat('MM/dd/yyyy');
    }
}

内容的提问来源于stack exchange,提问作者Anthony Madle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:30:52