将图纸合并为1张 - 范围宽度不正确

时间:2015-06-25 20:07:20

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

我想将几张图片合并为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

感谢您的回复!

2 个答案:

答案 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
}