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)存在两个致命错误:
- 误用赋值运算符
=代替比较运算符==,导致每次执行到该分支时直接给i赋值,强制终止循环,根本没完成全表遍历 - 数组索引从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
相关产品推荐
相关产品推荐

