例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配

Posted

技术标签:

【中文标题】例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配【英文标题】:Exception: The number of columns in the data does not match the number of columns in the range despite the range being created from data 【发布时间】:2020-06-29 05:53:06 【问题描述】:

我正在尝试找出我在此 Google 脚本中缺少的内容。我不断收到错误

异常:数据中的列数与范围内的列数不匹配。数据有 0 但范围有 15。

但这对我来说没有意义。

这是有问题的代码:

var range = ReleaseSchedule.getRange(1,1,output_data_sheet.length,output_data_sheet[0].length);
range.setValues(output_data_sheet);

ReleaseSchedule 是活动电子表格中的一个新工作表 output_data_sheet 是一个二维数组。我在脚本的前面有类似的代码,但由于某种原因,这个代码抛出了那个异常,我不知道为什么。任何帮助或想法将不胜感激。

【问题讨论】:

我针对您的情况提出了 2 个修改后的脚本。但我不确定你的整个剧本。因此,如果我对您的情况的猜测不正确,我深表歉意。那个时候,你能提供整个脚本来复制你的问题吗?借此,我想确认一下。 您确定 output_data_sheet 数据的列数相同,即使是第一行?最好使用调试器Logger.log(output_data_sheet.length, output_data_sheet[0].length)检查这些值是否符合您的预期。 能否提供检索output_data_sheet的相关脚本? 【参考方案1】:

我认为Exception: The number of columns in the data does not match the number of columns in the range. The data has 0 but the range has 15.这个错误的原因可能如下。

output_data_sheet 是二维数组。 output_data_sheet的第一个索引的数组长度是15 空数组(数组长度为0)包含在索引中,第一个索引除外。

当上面的output_data_sheet 用于setValues() 时,可能会出现这样的错误。为了消除这个问题,下面的修改怎么样?在这里,我想提出2种模式。

模式一:

在这种模式中,空元素从output_data_sheet 中删除。

从:
var range = ReleaseSchedule.getRange(1,1,output_data_sheet.length,output_data_sheet[0].length);
range.setValues(output_data_sheet);
到:
output_data_sheet = output_data_sheet.filter(String);  // <--- Added
var range = ReleaseSchedule.getRange(1,1,output_data_sheet.length,output_data_sheet[0].length);
range.setValues(output_data_sheet);

模式2:

在这种模式中,空元素和小于15长度的元素为output_data_sheet中的每个索引添加保持15长度的元素。

从:
var range = ReleaseSchedule.getRange(1,1,output_data_sheet.length,output_data_sheet[0].length);
range.setValues(output_data_sheet);
到:
output_data_sheet = output_data_sheet.map(r => r.length == 15 ? r : r.concat(Array(15 - r.length).fill("")));  // <--- Added
var range = ReleaseSchedule.getRange(1,1,output_data_sheet.length,output_data_sheet[0].length);
range.setValues(output_data_sheet);

参考资料:

filter() map()

【讨论】:

【参考方案2】:

在您需要的最后一列数据的下一列中,可能有一些不可见的内容,但它就在那里,这就是脚本提取的内容。 我通过添加以下代码行解决了这个问题:-

ws.getRange("J1:J").clearContent();

其中 J 是第一个空列。我需要从 A 列到 I 列的数据。

PS :- 上面的代码 sn-p 是函数的一部分,它调用文件夹中的所有工作表并将这些工作表中的数据提取到一个主工作表中。

【讨论】:

以上是关于例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配的主要内容,如果未能解决你的问题,请参考以下文章

范围实施中的例外

VBA 如何取ListBox中的第i行数据

JAVA使用POI获取Excel的列数与行数

基于多索引列数据框中的列范围进行切片

矢量调整大小后下标超出范围

LibreOffice Calc,如何计算表格中的列数?