我是数组的新手,并且发现自己处于死胡同。
我想:
这就是我所拥有的:
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
哪些变化可以解决这些问题?
答案 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);
}