我是数组新手,发现自己陷入了死胡同。
我愿意:
- 获取一张表中的所有数据并将其放入数组中。
- 从该数组中挑选某些信息,并将其添加到新数组中。
- 将经过过滤的新数组保存到不同的工作表中。
这是我所拥有的:
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/