Google AppScript报错:数据列数与范围列数不匹配(行22)
解决Google Apps Script数据列数与范围不匹配的报错
运行以下Google Apps Script代码时,第22行触发报错:
Exception: The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 6.
原代码如下:
function getVal() { var app = SpreadsheetApp; var ss = app.getActiveSpreadsheet(); var sheet = ss.getSheetByName("nav1"); const targetSheet = ss.getSheetByName('nav1'); var url = ""; var html = UrlFetchApp.fetch(url).getContentText(); var lines = html.split('\n'); var sheet = [] sheet.push(lines[0].split(';')) lines.forEach(function(line) { if (!isNaN(line[0]) && line[0] != " " && line[0] != "\r"){ var scheme = line.split(';') sheet.push(scheme) } }); targetSheet.getRange(1, 1, sheet.length, sheet[0].length).setValues(sheet); }
报错原因
- 变量命名冲突:代码先将
sheet定义为工作表对象,后续又重新赋值为数组,虽不直接报错,但易造成逻辑混淆。 - 列数不一致:核心问题是部分行用
;分割后得到的数组长度与表头(lines[0].split(';'))长度不匹配,比如某行分割后仅1列,但表头有6列,导致setValues时数据列数与目标范围列数不兼容。 - 行判断逻辑漏洞:
!isNaN(line[0])对字符串类型数字的判断不准确,且未过滤空行或格式错误的行,导致无效数据被加入数组。
修正后的代码
function getVal() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const targetSheet = ss.getSheetByName('nav1'); if (!targetSheet) return; // 避免找不到工作表报错 const url = ""; // 填入你的目标URL const html = UrlFetchApp.fetch(url).getContentText(); const lines = html.split('\n').filter(line => line.trim() !== ''); // 过滤空行 const dataArray = []; // 获取表头并整理格式 const header = lines[0].split(';').map(cell => cell.trim()); const columnCount = header.length; dataArray.push(header); // 处理后续有效行 lines.slice(1).forEach(line => { const trimmedLine = line.trim(); // 用正则准确判断以数字开头的行 if (/^\d/.test(trimmedLine)) { let rowData = trimmedLine.split(';').map(cell => cell.trim()); // 统一列数:不足补空,多余截断 while (rowData.length < columnCount) { rowData.push(''); } if (rowData.length > columnCount) { rowData = rowData.slice(0, columnCount); } dataArray.push(rowData); } }); // 清空旧数据(可选,按需调整) targetSheet.clearContents(); // 写入整理后的数据 targetSheet.getRange(1, 1, dataArray.length, columnCount).setValues(dataArray); }
关键修改点
- 重命名数组变量为
dataArray,避免与工作表变量冲突。 - 过滤空行,减少无效数据处理。
- 用正则表达式
/^\d/准确识别以数字开头的有效行。 - 强制统一所有行的列数,确保与表头列数一致。
- 增加工作表存在性校验,避免无意义报错。
内容的提问来源于stack exchange,提问作者rncb
相关产品推荐
相关产品推荐

