Google Apps Script目标范围列数不匹配错误排查求助
问题修复:Google Sheets 脚本列数不匹配错误
问题描述
初始构建时代码运行正常,近4个月来目标工作表出现异常,执行函数时触发错误:
Exception: The number of columns in the data does not match the number of columns in the range. The data has 2 but the range has 1
日志信息:
- 源数据行数为54
- 目标工作表最后一列识别为9,目标范围生成I1:I54
- H列有数据、I列为空,尝试删除列等操作无效
原代码
function storeDataPlac(){ var ss = SpreadsheetApp.getActiveSpreadsheet() var source = ss.getSheetByName("xArPlace") var sourceRange = source.getDataRange() var sourceValues = sourceRange.getValues() Logger.log(sourceValues) Logger.log("the number of rows of source data = "+sourceValues.length) var target = ss.getSheetByName("ArPlace") var targetA1 = target.getDataRange() Logger.log(targetA1.isBlank()) if (targetA1.isBlank() == true){ // range is blank, so Last Column = 1 var targetLC = 1 Logger.log("Column A is blank") } else{ // range is not blank, so last column <>1 var targetLC = target.getLastColumn()+1 Logger.log("the last column on the target sheet = "+targetLC) } var targetRange = target.getRange(1,targetLC,sourceValues.length) Logger.log("The target range = "+targetRange.getA1Notation()) targetRange.setValues(sourceValues) Logger.log("copies the data") }
错误原因
- 列数不匹配:源数据有2列,但代码创建目标范围时仅指定行数,默认只生成1列范围,导致
setValues写入时列数冲突。 - 列数识别错误:
target.getLastColumn()会因工作表隐藏列、单元格格式残留等因素返回不准确值,即使删除空列也无法重置,导致目标列定位错误。
修复方案
function storeDataPlac(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var source = ss.getSheetByName("xArPlace"); var sourceRange = source.getDataRange(); var sourceValues = sourceRange.getValues(); var sourceRowCount = sourceValues.length; var sourceColCount = sourceRange.getLastColumn(); // 获取源数据实际列数 Logger.log("源数据行数:"+sourceRowCount+",列数:"+sourceColCount); var target = ss.getSheetByName("ArPlace"); // 更可靠的空表判断:直接检查A1单元格 var isTargetBlank = target.getRange("A1").isBlank(); var targetLastValidCol; if (isTargetBlank){ targetLastValidCol = 0; Logger.log("目标表为空,从第1列开始写入"); } else { // 遍历找到真正最后一个有数据的列(忽略空列) targetLastValidCol = findLastNonEmptyColumn(target); Logger.log("目标表最后有数据列:"+targetLastValidCol+", 将写入第"+(targetLastValidCol+1)+"列"); } // 创建匹配源数据行列数的目标范围 var targetRange = target.getRange(1, targetLastValidCol + 1, sourceRowCount, sourceColCount); Logger.log("目标范围:"+targetRange.getA1Notation()); targetRange.setValues(sourceValues); Logger.log("数据写入完成"); } // 辅助函数:定位工作表最后一个非空列 function findLastNonEmptyColumn(sheet) { var maxColumns = sheet.getMaxColumns(); for (var col = maxColumns; col >= 1; col--) { var range = sheet.getRange(1, col, sheet.getMaxRows()); if (!range.isBlank()) { return col; } } return 0; }
修复说明
- 匹配行列数:新增获取源数据列数的逻辑,创建目标范围时明确指定列数,确保与源数据结构一致。
- 准确判断空表:改用A1单元格判断目标表是否为空,避免
getDataRange因格式残留误判。 - 精准定位目标列:通过辅助函数遍历所有列,找到真正最后一个有数据的列,解决
getLastColumn的识别偏差问题。
内容的提问来源于stack exchange,提问作者Tillthen BigHeart
相关产品推荐
相关产品推荐

