SpreadsheetApp setValues参数不匹配 命名范围列赋值报错
错误根因
Range.getValues() 返回的永远是二维数组,结构为 [ [第一行第一列值, 第一行第二列值...], [第二行第一列值, ...] ],即使操作的是单列范围,每一行对应的元素也是长度为1的一维数组(比如单元格值为test时,对应数组项为["test"])。你的代码存在三个直接触发报错/逻辑失效的问题:
- 取值逻辑错误:
var currentVal = vals[i]拿到的是第i行的整行数组,不是单元格的具体值,后续currentVal != ""的判断永远无法得到预期结果(数组是对象类型,和空字符串做不等判断恒为真)。 - 赋值逻辑错误:
otherRangeVals[i] = "new value"直接把原本的行数组替换成了字符串,彻底破坏了otherRangeVals的二维数组结构,不符合setValues()要求传入二维数组的参数规则,直接触发你看到的签名不匹配错误。 - 额外索引错位问题:
getValues()返回的数组索引从0开始对应范围的第一行,你直接拿工作表全局行号当数组索引用,会导致行位置偏移。
修正代码
只需要调整取值、赋值的层级,同时修正索引偏移即可,修正后的完整代码如下:
function setValuesInARange() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var range = ss.getRangeByName("columnOne"); var otherRange = ss.getRangeByName("columnTwo"); var startingRow = ss.getRangeByName("headerRow").getRow(); var vals = range.getValues(); var otherRangeVals = otherRange.getValues(); // 计算数据起始行在数组中的对应索引:全局行号减去范围自身的起始行号 var dataStartIndex = startingRow + 1 - range.getRow(); for (var i = dataStartIndex; i < vals.length; i++) { // 单列范围取每行第0位的元素,才是单元格实际值 var currentVal = vals[i][0]; Logger.log(currentVal); if (currentVal != "") { // 给对应行的第0位赋值,保留二维数组结构 otherRangeVals[i][0] = "new value"; } } otherRange.setValues(otherRangeVals); }
前置要求:两个命名范围
columnOne、columnTwo的尺寸、起始行位置必须完全一致,否则会触发范围尺寸不匹配的报错。
内容的提问来源于stack exchange,提问作者William Toscano
相关产品推荐
相关产品推荐

