嵌套函数场景下如何从内层遍历电子表格行的函数中按条件返回值
问题原因
你当前的代码无法拿到预期返回值,核心问题是Array.prototype.forEach()的回调函数返回值会被完全忽略:你在内层function(row)里写的return只能结束当前这一轮的遍历回调,既不能终止整个遍历流程,也无法把值传递给外层的GetOldAreaSize函数作为返回值输出。
修复方案
推荐两种实现方式,优先选择普通for循环,性能更高且支持中途终止遍历,同时我们会把原代码中大量重复的if判断优化为规则映射,后续维护更方便:
方案1:普通for循环实现(推荐)
function GetOldAreaSize(ID, area_changed, change_doc, area_kha, sheetSource) { // 定义规则映射表,避免写大量重复if else,后续新增规则直接修改这个对象即可 const docRuleMap = { "MR1": "PDD1", "MR2": "MR1", "MR3": "MR2", "MR4": "MR3", "MR5": "MR4", "MR6": "MR5" } // 传入的change_doc不在规则里直接无返回值 if (!docRuleMap.hasOwnProperty(change_doc)) return; const targetOldDoc = docRuleMap[change_doc]; const data = sheetSource.getDataRange().getValues(); for (let i = 0; i < data.length; i++) { const row = data[i]; // 不符合前置条件直接跳过当前行 if (row[0] !== ID || row[4] !== area_changed) continue; const change_doc_old = row[2] + row[3]; // 匹配到所有规则直接返回结果,同时终止遍历 if (change_doc_old === targetOldDoc) { const old_area = parseFloat(row[15]); // 仅MR1-MR4需要打印日志 if (["MR1", "MR2", "MR3", "MR4"].includes(change_doc)) { Logger.log(old_area + " - " + parseFloat(area_kha)) } return old_area; } } // 遍历完全部行未匹配到符合条件的内容,默认无返回值 }
方案2:数组some方法实现(如果你需要保留数组遍历写法)
function GetOldAreaSize(ID, area_changed, change_doc, area_kha, sheetSource) { const docRuleMap = { "MR1": "PDD1", "MR2": "MR1", "MR3": "MR2", "MR4": "MR3", "MR5": "MR4", "MR6": "MR5" } if (!docRuleMap.hasOwnProperty(change_doc)) return; const targetOldDoc = docRuleMap[change_doc]; const data = sheetSource.getDataRange().getValues(); let result = undefined; data.some(function (row) { if (row[0] == ID && row[4] == area_changed && (row[2]+row[3]) == targetOldDoc) { const old_area = parseFloat(row[15]); if (["MR1", "MR2", "MR3", "MR4"].includes(change_doc)) { Logger.log(old_area + " - " + parseFloat(area_kha)) } result = old_area; return true; // some方法遇到return true会直接终止遍历 } }) return result; }
功能说明
两种实现都完全满足你的需求:
- 仅当匹配到完全符合规则的行时,才会返回对应的浮点数值
- 无匹配项时默认返回
undefined,也就是无返回值 - 消除了原代码中的冗余判断,后续调整规则不需要修改大量逻辑,仅需更新
docRuleMap映射表即可
内容的提问来源于stack exchange,提问作者Matija Kordic
相关产品推荐
相关产品推荐

