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

Google Apps Script无法匹配值问题:原因排查及解决方案

Google Apps Script 客户记录匹配失败问题排查与解决

我在for循环中嵌套了if else语句,需求是遍历WIP工作表里的现有客户,若找到和Renderings工作表当前选中客户匹配的记录,就更新该客户的其他字段值。之前代码无法识别匹配的客户名称,我怀疑问题出在if语句或者wipValues、rdCustomer变量的声明方式上。

编辑说明

  • 已更新代码完整展示需求,并提供示例表格(示例表格包含Renderings和WIP工作表,WIP表中有"The Most OK Business"和"Mom & Pop"两个客户,修改Renderings工作表的状态时应匹配到这两个客户)
  • 问题已解决!原因在于else if语句的条件错误,应使用i == wipValues.length-1而非i = wipValues.length + 1

原问题代码

function onEdit(e) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const activeSheet = SpreadsheetApp.getActiveSheet();
  const rdSheet = ss.getSheetByName("Renderings");
  const wipSheet = ss.getSheetByName("WIP");

  var cell = e.range;
  var row = cell.getRow();
  var col = cell.getColumn();

  // Rendering工作表状态列被修改时触发
  if (activeSheet.getSheetName() == 'Renderings' && col == 12) {
    // 获取当前行Renderings工作表的字段值
    var rdValues = rdSheet.getRange(row, 1, 1, 16).getValues();
    var rdWO = rdValues[0][0];
    var rdCustomer = rdValues[0][1];
    var rdQTY = rdValues[0][2];
    var rdJobNotes = rdValues[0][3];
    var rdRevNum = rdValues[0][5];
    var rdAppV = rdValues[0][7];
    var rdTime = rdValues[0][8];
    var rdRd = rdValues[0][9];
    var rdSales = rdValues[0][10];
    var rdRdDate = rdValues[0][13];
    var rdProdDate = rdValues[0][14];

    // 获取WIP工作表的所有数据
    var wipRange = wipSheet.getDataRange();
    var wipValues = wipRange.getValues();

    Logger.log('looking for ' + rdCustomer + ' match in WIP');
    // 遍历WIP表,匹配客户名称和工作备注
    for (let i = 0; i < wipValues.length; i++) {
      if (wipValues[i][1] === rdCustomer && wipValues[i][3] === rdJobNotes) {
        Logger.log('Match found in WIP');
        wipValues[i][0] = rdWO;
        wipValues[i][2] = rdQTY;
        wipRange.setValues(wipValues);
        Logger.log('WO updated in WIP');
        break;

      }
      else if (i = wipValues.length + 1) {
        Logger.log('match not found');
        break;
      }
    }
    return;
  }
  // WIP工作表状态列被修改时直接返回
  else if (activeSheet.getSheetName() == 'WIP' && col == 22) {
    return;
  }
}

问题核心原因

原代码中else if (i = wipValues.length + 1)存在两个致命错误:

  1. 误用赋值运算符=代替比较运算符==,导致每次执行到该分支时直接给i赋值,强制终止循环,根本没完成全表遍历
  2. 数组索引从0开始,WIP表最后一条记录的索引是wipValues.length - 1,wipValues.length + 1这个条件本身就不可能触发

修正后的循环部分代码:

for (let i = 0; i < wipValues.length; i++) {
  if (wipValues[i][1] === rdCustomer && wipValues[i][3] === rdJobNotes) {
    Logger.log('Match found in WIP');
    wipValues[i][0] = rdWO;
    wipValues[i][2] = rdQTY;
    wipRange.setValues(wipValues);
    Logger.log('WO updated in WIP');
    break;
  }
  // 遍历到最后一条记录仍未匹配时输出日志
  else if (i == wipValues.length - 1) {
    Logger.log('match not found');
  }
}

内容的提问来源于stack exchange,提问作者I don't have an Uber phone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:53:13