我想将几张图片合并为1张spreadheeet,并希望将所有数据粘贴在彼此之下。
我当前的代码如下:
function updateMaster() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var allSheets = ss.getSheets();
var repArray = new Array();
// build array of all sheets
for (i in allSheets) {
repArray.push(allSheets[i].getName());
}
// store all sheets in array
var sheetArray = [];
// loop through all rep sheets
for (var j in allSheets) {
// get each sheet
var tempSheet = ss.getSheetByName(repArray[j]);
// get sheet data
var dataRange = tempSheet.getDataRange().getValues();
// remove the first header row
dataRange.splice(parseInt(0), 1);
// append sheet data to array
var sheetArray = sheetArray.concat(dataRange);
}
// Time to update the master sheet
var mSheet = ss.getSheetByName("Master");
// clear the whole sheet
mSheet.clear({contentsOnly:true});
// write to the Master sheet via the array
mSheet.getRange(1, 1, sheetArray.length, 4).setValues(sheetArray); //I GET THE ERROR BECAUSE OF THIS LINE
// force spreadsheet updates
SpreadsheetApp.flush();
// pause (1,000 milliseconds = 1 second)
Utilities.sleep("200");
// delete empty rows at bottom
var last = mSheet.getLastRow();
var max = mSheet.getMaxRows();
if (last !== max) {mSheet.deleteRows(last+1,max-last);}
}
但是,我收到错误,因为其他工作表的列长度不同。
错误消息:
Incorrect range width, was 5 but should be 4
我收到错误:
mSheet.getRange(1, 1, sheetArray.length, 4).setValues(sheetArray);
我基本上只想发布下面的数据。任何建议如何使列长度变量?
以下是我的电子表格的链接:
https://docs.google.com/spreadsheets/d/1TuHaqs20PvNwOJ46bQOAwN3Nt5vyRl7Win1Lul4m-e8/edit?usp=sharing
感谢您的回复!
答案 0 :(得分:1)
sheetArray
数组具有不同长度的内部行元素。一些内部数组有4个元素,有些有5个元素。您不能从具有不同内部元素长度的数组中设置值。如果将列宽更改为5,则错误指出它应为4,如果将其更改为4,则表示它应为5.您需要在包含4列的范围中添加额外的空元素,或者将每张纸单独写入主页。
获取其中一个内部数组,并找到内部数组的长度。那是你的列长。
在这一行:
var dataRange = tempSheet.getDataRange().getValues();
您正在使用getDataRange()
方法。这会导致范围对于具有不同列数的每个工作表而言具有不同的尺寸。如果将列宽设置为具有最多列的工作表中的最大列数,则所有内部元素的长度都相同。你的代码会编写很多空单元格。但不知道是否有任何不利因素。
var columsToWriteTo = sheetArray[0].length
mSheet.getRange(1, 1, sheetArray.length, columsToWriteTo).setValues(sheetArray);
以上代码获取二维sheetArray
的第一个内部数组,并获取内部数组的长度。
答案 1 :(得分:0)
另一个答案指出了这个问题,但未提供解决方案。
您应该做的是在使用setValues()
设置其值之前使最终数组均匀。
下面是一个代码演示,它通过在太短的行中添加空项来完成它。我在代码中添加了注释来解释
function ArrayNormalize() {
var sh = SpreadsheetApp.getActive();
var data1 = sh.getSheets()[0].getDataRange().getValues(); // get data from sheet1
var data2 = sh.getSheets()[1].getDataRange().getValues();// same from sheet2 that has a different width
var combine = data1.concat(data2);
Logger.log("combine = "+JSON.stringify(combine));
//get Max array width
var maxWidth=0
for(var n=0;n<combine.length;n++){
Logger.log(n+' - '+combine[n]+" length = "+combine[n].length);
if(combine[n].length>=maxWidth){maxWidth=combine[n].length};
}
Logger.log("maxWidth = "+maxWidth);
//normalize
for(var n=0;n<combine.length;n++){
while(combine[n].length<maxWidth){
combine[n].push('');// while row is shorter add empty "cells" (=array elements)
}
}
sh.insertSheet().getRange(1,1,combine.length,combine[0].length).setValues(combine);// insert the result in new sheet to check the result but you can insert it anywhere else of course
}