Google Apps Script报错:数据列数与范围不匹配,求修复
问题修复:提交修改时列数不匹配报错
报错信息
Exception: The number of columns in the data does not match the number of columns in the range. The data has 5 but the range has 1.
场景:通过HTML侧边栏向另一工作簿的表格提交修改,尝试仅更新第5列时触发报错,注释掉的整行更新代码可正常运行。
错误原因
调用sh2.getRange(result+2,5).setValues([row])时,row是包含5个元素的数组(对应HTML里的5个列值),而选中的目标是单个单元格(1行1列范围)。setValues()要求传入的二维数组行列数必须和目标范围完全匹配,这里数据是1行5列、范围是1行1列,因此出现不匹配报错。
修复方案
方案1:最小改动修改Google Apps Script代码
直接从传入的row数组中提取第5列对应的值,用setValue()(单个值更新推荐使用该方法,比setValues()更简洁)更新单元格:
function setSelectedRow(row) { let cell = SpreadsheetApp.getCurrentCell(); let sheet = cell.getSheet(); var active_range = sheet.getActiveRange() var id = sheet.getRange(active_range.getRowIndex(), 1).getValue(); Logger.log(id) var sh2 =SpreadsheetApp.openById('1mtmEMTtdEWk-MqC-5cXIGTefibUirpSjtaFQwAPAO5Q').getSheetByName('Sheet1'); const searchCol = 1; const range = sh2.getRange(2, searchCol,sh2.getLastRow()); const data = range.getValues(); const result = data.finder(id); Logger.log(result) // 修复:提取第5列对应的值(数组索引为4),用setValue更新单个单元格 sh2.getRange(result+2,5).setValue(row[4]); //sh2.getRange(result+2,1,1,sh2.getLastColumn()).setValues([row]); } Array.prototype.finder = function(val){ if(val == "") return false; for(let i=0;i<this.length;i++){ if(this[i].toString().indexOf(val) > -1) return i; } return -1; }
方案2:优化HTML+GS(减少不必要的数据传输)
如果仅需更新第5列,无需传递所有5列的值,仅传递目标列值即可,代码更高效:
修改HTML的submitOnClick函数:
function submitOnClick() { try { // 仅获取第5列的值 const column5Value = document.getElementById("column5").value; google.script.run.withFailureHandler( function (err) { alert(err); } ).setSelectedRow(column5Value); } catch(err) { alert("Error in submitOnClick: "+err); } }
对应修改GS的setSelectedRow函数:
function setSelectedRow(column5Value) { let cell = SpreadsheetApp.getCurrentCell(); let sheet = cell.getSheet(); var active_range = sheet.getActiveRange() var id = sheet.getRange(active_range.getRowIndex(), 1).getValue(); Logger.log(id) var sh2 =SpreadsheetApp.openById('1mtmEMTtdEWk-MqC-5cXIGTefibUirpSjtaFQwAPAO5Q').getSheetByName('Sheet1'); const searchCol = 1; const range = sh2.getRange(2, searchCol,sh2.getLastRow()); const data = range.getValues(); const result = data.finder(id); Logger.log(result) // 直接传入单个值更新 sh2.getRange(result+2,5).setValue(column5Value); //sh2.getRange(result+2,1,1,sh2.getLastColumn()).setValues([row]); } Array.prototype.finder = function(val){ if(val == "") return false; for(let i=0;i<this.length;i++){ if(this[i].toString().indexOf(val) > -1) return i; } return -1; }
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

