Javascript 无缘无故获得不正确的范围高度?
我正在写一个脚本,将一个范围从一张纸复制粘贴到另一张纸。粘贴范围大小应通过使用两个函数来减小:一个用于删除具有特定值的行,另一个是聚合函数 在我引入了聚合函数之后,我开始出现这个错误。该函数基本上是使用减少JS函数来减少数组大小 我已经复制了我的问题,代码可以在脚本编辑器中访问 运行脚本时,出现以下错误: 不正确的范围高度为28,但应为7(第36行,文件“测试”) 我不知道我为什么会犯这个错误。我的聚合函数返回一个格式正确、长度正确的数组Javascript 无缘无故获得不正确的范围高度?,javascript,google-apps-script,google-sheets,google-spreadsheet-api,Javascript,Google Apps Script,Google Sheets,Google Spreadsheet Api,我正在写一个脚本,将一个范围从一张纸复制粘贴到另一张纸。粘贴范围大小应通过使用两个函数来减小:一个用于删除具有特定值的行,另一个是聚合函数 在我引入了聚合函数之后,我开始出现这个错误。该函数基本上是使用减少JS函数来减少数组大小 我已经复制了我的问题,代码可以在脚本编辑器中访问 运行脚本时,出现以下错误: 不正确的范围高度为28,但应为7(第36行,文件“测试”) 我不知道我为什么会犯这个错误。我的聚合函数返回一个格式正确、长度正确的数组 function append_range(){
function append_range(){
var origin_sheet = SpreadsheetApp.openById('1-2ZheMz1p01qwtwY3ghbNjJedYfGXeylnLEjDMCLpMw');//open the file
origin_sheet = origin_sheet.getSheetByName('test');
var rangeStart = 2;
var range = origin_sheet.getRange('A'+ (rangeStart.toString())+':T'+ (origin_sheet.getLastRow()).toString());
var dataFromRange = range.getValues();
var dataFromRangeLength = dataFromRange.length;
var destination_sheet = SpreadsheetApp.openById('1-2ZheMz1p01qwtwY3ghbNjJedYfGXeylnLEjDMCLpMw');
destination_sheet = destination_sheet.getSheetByName('append');
var rowLast = destination_sheet.getLastRow()+1;
Logger.log("row last" + rowLast);
var formattedRange = deleteRows(dataFromRange);
var groups = aggregate(formattedRange);
var aggregates = [];
for(var group in groups)
{
aggregates.push(groups[group]);
}
Logger.log(aggregates);
var formattedRangeLength = aggregates.length;
Logger.log("formattedRangeLength" + formattedRangeLength);
destination_sheet.getRange(rowLast,1,formattedRangeLength, 20).setValues(deleteRows(dataFromRange));
function isDate(sDate) {
if (isValidDate(sDate)) {
sDate = Utilities.formatDate(new Date(sDate), "PST", "yyyy-MM-dd");
}
return sDate;
}
function isValidDate(d) {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
return false;
return !isNaN(d.getTime());
}
//
function deleteRows(dataRange){//just pass the range in an array and this method will return another array with filtered range
var formatted = dataRange.filter(function(e) {
return e[8]||e[9]||e[10]||e[11]||e[12]||e[13]||e[14]||e[15]||e[16]||e[17]||e[18]||e[19];
});
return formatted;
}
function aggregate(data)
{
var groups = data.reduce(
function(accumulator, previous){
{
var key = previous[1] + previous[3] + previous[5] + previous[6];
var group = accumulator[key];
if(group == null || typeof group == 'undefined')
{
accumulator[key] = previous;
}
else {
var startIndex = 8;
for(var i = startIndex; i < previous.length;i++)
{
group[i] += previous[i];
}
}
return accumulator;
}},
{});
return groups;
}
}
函数append_range(){
var origin_sheet=SpreadsheetApp.openById('1-2ZheMz1p01qwtwY3ghbNjJedYfGXeylnLEjDMCLpMw');//打开文件
origin_sheet=origin_sheet.getSheetByName(“测试”);
var rangeStart=2;
var range=origin\u sheet.getRange('A'+(rangeStart.toString())+':T'+(origin\u sheet.getLastRow()).toString());
var dataFromRange=range.getValues();
var dataFromRangeLength=dataFromRange.length;
var destination_sheet=电子表格app.openById('1-2ZHEMZ1P01QWTWY3GHBNJJEDYFGXEELJDMCLPMW');
destination_sheet=destination_sheet.getSheetByName('append');
var rowLast=destination_sheet.getLastRow()+1;
Logger.log(“最后一行”+最后一行);
var formattedRange=deleteRows(dataFromRange);
var组=聚合(formattedRange);
var聚合=[];
for(组中的var组)
{
聚合。推(组[组]);
}
Logger.log(聚合);
var formattedRangeLength=aggregates.length;
Logger.log(“formattedRangeLength”+formattedRangeLength);
destination_sheet.getRange(最后一行,1,formattedRangeLength,20).setValue(deleteRows(dataFromRange));
函数isDate(sDate){
if(isValidDate(sDate)){
sDate=实用程序.formatDate(新日期(sDate),“PST”,“yyyy-MM-dd”);
}
返回sDate;
}
函数isValidDate(d){
if(Object.prototype.toString.call(d)!=“[对象日期]”)
返回false;
return!isNaN(d.getTime());
}
//
函数deleteRows(dataRange){//只需在数组中传递范围,此方法将返回另一个具有筛选范围的数组
var formatted=dataRange.filter(函数(e){
返回e[8]| e[9]| e[10]| e[11]| e[12]| e[13]| e[14]| e[15]| e[16]| e[17]| e[18]| e[19];
});
返回格式;
}
函数聚合(数据)
{
var组=data.reduce(
功能(累加器,上一个){
{
var键=上一个[1]+上一个[3]+上一个[5]+上一个[6];
var组=累加器[键];
if(group==null | | typeof group=='undefined')
{
累加器[键]=上一个;
}
否则{
var startIndex=8;
对于(var i=startIndex;i
该.setValues()
没有设置它试图设置的删除行(dataFromRange)
我认为这可能有效:
var output=deleteRows(dataFromRange));
destination_sheet.getRange(rowLast,1,output.length, output[0].length).setValues(deleteRows(output));
这假定为非锯齿阵列
当值数组的行数超过
setValues()
范围时,会出现此错误。如果您想更改.reduce()
和范围,则setValues()
代码可能会看到出错的地方。@random parts该代码位于此工作表的脚本编辑器中!报告错误的代码行是:destination_sheet.getRange(rowLast,1,formattedRangeLength,20).setValues(deleteRows(dataFromRange));“应为7”表示已将formattedRangeLength的范围高度设置为7;然而,您希望使用从函数调用deleteRows(dataFromRange)返回的数组设置值,该数组的长度不是7而是28。您声明聚合函数按预期返回;但这里有一个不匹配,这导致了您的error@RobertRoss看到它发布比点击随机链接更容易spreadsheets@random-部分,所有权利,我编辑了我的问题
var output=deleteRows(dataFromRange));
destination_sheet.getRange(rowLast,1,output.length, output[0].length).setValues(deleteRows(output));