数据列数与目标范围列数不匹配问题求助——调试时数组维度匹配仍报错
解决"数据中的列数与范围中的列数不匹配"错误
先直接说最可能的问题——你的数组索引出问题了!
看你的代码,colourRangeVals是31行10列的数组,但你初始化colours时循环从i=1开始:
for (var i = 1; i < colourRangeVals.length; i++) { colours[i] = []; // ... 填充颜色 }
这意味着colours[0]根本没有被初始化(是undefined),而colourRange是31行的范围,当你调用setBackgrounds(colours)时,第一行的undefined会被当成长度为0的数组,和后面10列的行不匹配,直接触发列数错误。
修复步骤:
修正循环索引:把循环改成从
i=0开始,同时调整代码里的行号引用(因为原来的i从1开始,对应行号要+1):for (var i = 0; i < colourRangeVals.length; i++) { colours[i] = []; for (var j = 0; j < colourRangeVals[i].length; j++) { var avgTarget = subDash.getRange("O1").getValue(); var gradeCell = subDash.getRange(3, j + 12).getValue(); // 原来的i+1改成i+2,保持行号和原来一致 var avgTargetCell = subSheetPP.getRange(i + 2, 17).getValue(); // 原来的i+3改成i+4 var mockGradeCell = subDash.getRange(i + 4, j + 12); var mockGradeCellVal = mockGradeCell.getValue(); // ... 颜色判断逻辑 } }简化重复的条件判断:你原来的9个
if-else可以大幅简化,利用avgTarget本身就是偏移量的特点,减少冗余代码:var threshold = avgTargetCell + avgTarget; var color = 'white'; if (mockGradeCellVal >= 0) { if (gradeCell > threshold) { color = "#dabeec"; } else if (gradeCell == threshold) { color = "#b8dac1"; } else if (gradeCell < threshold) { color = "#e7b3b3"; } } colours[i][j] = color;验证维度匹配:在设置背景前加日志,确认
colours和colourRange的维度完全一致:Logger.log("colourRange: " + colourRange.getNumRows() + "行 × " + colourRange.getNumColumns() + "列"); Logger.log("colours数组: " + colours.length + "行 × " + (colours[0] ? colours[0].length : "无效第一行") + "列");
额外检查点:
- 确认
colourRange的范围确实是31行10列,没有选多或者选少; - 确保
colourRangeVals的每一行都是10个元素,没有行长度不一致的情况。
按这个思路修改后,应该就能解决列数不匹配的问题了~
内容的提问来源于stack exchange,提问作者Fazila
相关产品推荐
相关产品推荐

