所以我一直在敲打这个,似乎无法绕过2D阵列。我已经设置了以下代码,但无法使setValues()
工作(代码结束。)
我很确定我需要将其设置为数组,但是我尝试设置它的每一种方式都会产生不同的错误消息。如何正确编写代码以避免错误消息。
function onSearch() {
var sheetID = DriveApp.getFilesByName('Dash').next().getId();
var ss = SpreadsheetApp.openById(sheetID);
var sheet = ss.getSheetByName("Master List");
//Loop through Class List, get Course Codes
var classes = ss
.getSheetByName("sheetInfo")
.getRange(1, 2, 3)
.getValues();
//Loop through courses
for (var k = 0; k < classes.length; k++) {
var classCode = classes [k];
var searchVal = classCode;
var column = 18;
//Get Course Sheets
var classSheetArray = ss.getSheetByName("sheetInfo")
.getRange(1, 1, 3)
.getValues();
var classSheetName = classSheetArray [k];
var classSheet = ss.getSheetByName(classSheetName);
//Insert headers into Class sheets
sheet.getRange(1, 1, 1, 17).copyTo(classSheet.getRange(1, 1, 1, 17));
//Loop through 9 different course codes from student timetable
for (var j = 0; j < 9; j++) {
var searchCol = sheet.getRange(2, column+j, sheet.getLastRow())
.getValues();
for (var i = 0, len = searchCol.length; i < len; i++) {
//Take the data from the search and place it in the corresponding class tab.
//This data will have 17 columns and the number of rows is dependent on the number of returned students.
if (searchCol[i][0] == searchVal) {
var lastRow = classSheet.getLastRow();
var sourceInfo = sheet.getRange(i+2, 1, 1, 17)
.getValues();
tempArray = [];
tempArray.push(sourceInfo[i]);
Logger.log(tempArray); // WHEN I LOG THE ARRAY THE DATA LOOKS LIKE [[col 1, col 2 ...]][[col 1, col 2 ...]]...
classSheet.getRange(lastRow+1,1,1,sourceInfo.length) //DEFINITELY KNOW THIS TO BE WRONG...
.setValues(tempArray[0][i]);
}
}
}
}
}
答案 0 :(得分:5)
目前,在您的代码中,sourceInfo
的长度始终为1:
var sourceInfo = sheet.getRange(i+2, 1, 1, 17)
.getValues();
getRange
有4个参数的语法是:
getRange(start row, start column, number of rows, number of columns)
您获得的行数为1.您将获得17列,但外部数组长度为1.内部数组长度为17.
所以,你可以使用:
classSheet.getRange(lastRow+1,1,1,sourceInfo[0].length)
请注意[0]
之后sourceInfo
的索引:sourceInfo[0]
对于列数,返回长度为17。
如果您不希望列数不是1,那么在参数中使用arrayName.length
是没有意义的。
您正在使用sourceInfo
设置列数,但随后编写tempArray
。您应该使用tempArray
来设置参数值。使用具有数据的数组来设置参数。
classSheet.getRange(lastRow+1,1,tempArray.length,tempArray[0].length)
.setValues(tempArray);
答案 1 :(得分:1)
而不是
classSheet.getRange(lastRow+1,1,1,sourceInfo.length).setValues(tempArray[0][i]);
尝试
classSheet.getRange(lastRow+1,1,1,sourceInfo.length).setValues(tempArray);
如果tempArray
是2D数组,则tempArray[0][i]
将返回数组元素而不是2D数组,而setValues(values)
需要2D数组。
来自https://developers.google.com/apps-script/reference/spreadsheet/range#setvaluesvalues
setValues方法(值)
设置矩形网格值(必须与此尺寸匹配) 范围内)。
var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; // The size of the two-dimensional array must match the size of the range. var values = [ [ "2.000", "1,000,000", "$2.99" ] ]; var range = sheet.getRange("B2:D2"); range.setValues(values);