将数据从一张纸过滤到另一张

时间:2016-06-08 17:52:35

标签: javascript arrays google-apps-script google-sheets

我是数组的新手,并且发现自己处于死胡同。

我想:

  1. 从一张纸上获取所有数据并将其放入数组中。
  2. 从该阵列中挑选出某些信息,然后将其添加到新阵列中。
  3. 将新的过滤后的数组保存到其他工作表中。
  4. 这就是我所拥有的:

    function myFunction() 
    {
      var ss = SpreadsheetApp.openById('ID');
      var sheet1 = ss.getSheetByName('sheet1');
      var sheet2 = ss.getSheetByName('sheet2');
      var range = sheet1.getDataRange();
      var values = range.getValues();
      var lastRow = sheet1.getLastRow();
      var lastCol = sheet1.getLastColumn();      
      var rowCounter = 0;
      var inArr = new Array(new Array());
      var outArr = []
      for (var i = 1; i <= lastRow; i++) 
      {
         var suspended = values[i][39]; //this value is ether True or False
         if (suspended == 'False')
         {
            rowCounter = rowCounter +1;
            outArr[rowCounter] = [];
            inArr[i] = values[i];
            for (var j = 0; j <= 42; j++) 
            {        
               outArr[rowCounter].push(inArr[i][j]);
          }
       }
    }
    sheet2.getRange(1, 1,rowCounter,lastCol).setValues([outArr]);
    }
    

    inArr数组正在收集整行,但我想只收集该行中的特定列:

    values[i][0], values[i][26], values[i][28]
    

    此外,当我尝试将数组附加到工作表时,我收到错误:

      

    范围宽度不正确,为1493,但应为1

    哪些变化可以解决这些问题?

1 个答案:

答案 0 :(得分:1)

  

inArr数组正在收集整行,我只想收集该行中的特定列

如果values是我们的完整数据数组,values[i]是第i行,我们可以得到相应的缩减行:

var newRow = [ values[i][0], values[i][26], values[i][28] ];

使用newRow中的特定元素创建一维数组values[i]。如果我们为许多值执行此操作,则代码行将变得冗长且难以维护。我们可以使用另一个数组来包含我们感兴趣的列的索引,并循环遍历它们:

var outColumns = [0,26,28];   // Column indexes we want
for (var j=0; j < outColumns.length; j++) {
  newRow.push( values[i][outColumns[j]] );
}
  

范围宽度不正确,为1493,但应为1

此处,您的范围从(1,1)(rowCounter,lastCol),显然宽1493列,并且正在使用包含一个元素的数组调用setValues()

sheet2.getRange(1, 1,rowCounter,lastCol).setValues([outArr]);

单个元素是因为你已将outArr数组括在大括号中,使其成为具有一个元素的一维数组(恰好是一个二维数组)。

有一个简单的模式用于编写矩形数组,无需单独计算行和列:

sheet2.getRange(1, 1, outValues.length, outValues[0].length)
      .setValues(outValues);

通过在整个数组(行)和第一行(列)上使用JavaScript数组.length()方法,我们始终可以获得所设置数组的正确大小。

更新了代码

function newFunction() {
  var ss = SpreadsheetApp.openById('ID');
  var sheet1 = ss.getSheetByName('sheet1');
  var sheet2 = ss.getSheetByName('sheet2');
  var range = sheet1.getDataRange();
  var values = range.getValues();  
  var outValues = [];
  var outColumns = [0,26,28];   // Column indexes we want
  var suspendedColumn = 39;

  for (var i=0; i < values.length; i++) {
    var newRow = [];
    var suspended = values[i][suspendedColumn]; //this value is ether True or False
    if ('False' === suspended)
    {
      // Filter values using outColumns
      for (var j=0; j < outColumns.length; j++) {
        newRow.push( values[i][outColumns[j]] );
      }
      outValues.push(newRow);
    }
  }
  // Write selected data to sheet2
  sheet2.getRange(1, 1, outValues.length, outValues[0].length)
        .setValues(outValues);
}