如何使用setValues()粘贴我从getValues()获得的数据? Google电子表格

时间:2016-02-15 15:50:12

标签: google-apps-script google-sheets range

所以我一直在敲打这个,似乎无法绕过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]); 

                }
            }
        } 
    }
}

2 个答案:

答案 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);