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

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

我是数组新手,发现自己陷入了死胡同。

我愿意:

  1. 获取一张表中的所有数据并将其放入数组中。
  2. 从该数组中挑选某些信息,并将其添加到新数组中。
  3. 将经过过滤的新数组保存到不同的工作表中。

这是我所拥有的:

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]

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

Incorrect range width, was 1493 but should be 1

哪些更改可以解决这些问题?

最佳答案

The inArr array is collecting the entire row I would like to collect only specific columns in that row

如果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]] );
}

Incorrect range width, was 1493 but should be 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);
}

关于javascript - 将数据从一张纸过滤到另一张纸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709568/

相关文章:

javascript - javascript数组的快速分组

arrays - 更新 TextField 中的值并相应地更新其数组索引

html - 谷歌应用程序脚本 HTMLService 按钮单击打开新的空白选项卡

javascript - 如何将 google 工作表中的单元格值设置为 HTML 侧边栏文本区域的默认值?

javascript - 如何在 javascript 中测试 firebase 通知 OnTokenRefresh 方法调用?

javascript - 将 JavaScript 数组的字符串表示形式转换为对象

javascript - 将 php true 或 false 值分配给 JS var

php - preg_replace/e 修饰符被弃用,使用数组作为模式和替换

javascript - 根据点击为 HTML <area> 着色

google-apps-script - 如何合并 Google 文本文档中表格的两个单元格而不出现这种奇怪的结果?