You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

 }

错误原因

  1. 列数不匹配:源数据有2列,但代码创建目标范围时仅指定行数,默认只生成1列范围,导致setValues写入时列数冲突。
  2. 列数识别错误: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;
}

修复说明

  1. 匹配行列数:新增获取源数据列数的逻辑,创建目标范围时明确指定列数,确保与源数据结构一致。
  2. 准确判断空表:改用A1单元格判断目标表是否为空,避免getDataRange因格式残留误判。
  3. 精准定位目标列:通过辅助函数遍历所有列,找到真正最后一个有数据的列,解决getLastColumn的识别偏差问题。

内容的提问来源于stack exchange,提问作者Tillthen BigHeart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:00:07