Google Apps自定义函数For循环无法推进问题排查
循环逻辑问题排查与修复
问题代码
for (row = calendar_array.length - 1; row >= 0; row--) { for (column = calendar_array[0].length - 1; column >= 1; column--) { //if (calendar_array[row][column] == alternative_activities[row2][1] && calendar_array[row][0] == calendar_array[arrayRowPosition][0]) if (check_array.indexOf(calendar_array[row][column]) > -1 && calendar_array[row][0] == calendar_array[arrayRowPosition][0]) { var hold = check_array.indexOf(calendar_array[row][column]); return alternative_activities[hold+1][1] + '\n Found in [' + row + '][' + column + ']'; } } }
前置确认
- 已通过单步调试验证:Calendar表和Alternate Workouts表的数组数据均已正确传入函数,问题仅出在上述循环代码中。
数据源说明
- Calendar表:当前位置上方的行数据
- Alternate Workouts表:同一张Google Sheets内的关联表
- 两组数据取自同一电子表格,便于数据引用
需求目标
- 在Calendar表当前位置及上方行中,查找与Alternate Workouts表匹配的训练项目(通过
indexOf判断) - 必须满足:Calendar表TYPE列(B列3-18行)与Alternate Workouts表TYPE列(A列25-46行)匹配
- 找到符合条件的项目后,获取Alternate Workouts表中该项目的下一个训练项目,结果需遵循表内训练顺序
实际问题
循环找到第一个匹配元素后立即终止,无法继续遍历后续可能的匹配项,导致结果不符合预期。
问题核心
代码中的return语句是关键问题:一旦触发return,整个函数会直接终止,循环自然无法继续执行。
修复方案
根据需求场景,提供两种常用修复方式:
场景1:收集所有匹配结果
如果需要获取所有符合条件的匹配项对应的下一个训练项目,用数组存储结果,循环结束后统一返回:
const results = []; for (row = calendar_array.length - 1; row >= 0; row--) { for (column = calendar_array[0].length - 1; column >= 1; column--) { if (check_array.indexOf(calendar_array[row][column]) > -1 && calendar_array[row][0] == calendar_array[arrayRowPosition][0]) { const hold = check_array.indexOf(calendar_array[row][column]); results.push(`${alternative_activities[hold+1][1]}\n Found in [${row}][${column}]`); } } } // 返回所有结果,或根据需求取最后一个(最近匹配项) return results.length ? results : '无匹配项'; // 若仅需最近匹配项:return results.length ? results[results.length-1] : '无匹配项';
场景2:仅取最近匹配项(从后往前遍历的最后一个匹配)
如果需求是找到当前位置上方最近的匹配项,用变量存储最新结果,循环结束后返回:
let finalResult = '无匹配项'; for (row = calendar_array.length - 1; row >= 0; row--) { for (column = calendar_array[0].length - 1; column >= 1; column--) { if (check_array.indexOf(calendar_array[row][column]) > -1 && calendar_array[row][0] == calendar_array[arrayRowPosition][0]) { const hold = check_array.indexOf(calendar_array[row][column]); finalResult = `${alternative_activities[hold+1][1]}\n Found in [${row}][${column}]`; // 若当前行找到匹配后无需检查其他列,可添加break跳出内层循环 // break; } } } return finalResult;
额外提示
当前代码中未明确体现TYPE列的匹配逻辑,建议确认check_array是否已关联TYPE过滤规则。若未关联,需补充TYPE列的相等判断,避免出现项目匹配但TYPE不匹配的无效结果。
内容的提问来源于stack exchange,提问作者Drew254
相关产品推荐
相关产品推荐

