请注意,这不是How to extend an existing JavaScript array with another array, without creating a new array?的重复,因为我希望拥有一个嵌套数组,而不是简单地将一个数组与另一个数组扩展成一个数组。在将此问题标记为重复之前,请正确阅读该问题。
我正在遍历(Google)工作表中的行以收集值,并希望将每一行作为数组添加到数组中,这将导致如下所示的输出(简化示例说明):
array_main = [[row1_cell1,row1_cell2,row1_cell3],[row2_cell1,row2_cell2,row2_cell3],...]
我首先使用.push尝试了此操作,它添加了值,但不作为数组:
model.get_params()
我知道有人问过类似的问题,但是大多数问题只是建议使用.concat合并两个数组。我也尝试过此操作,但它不会向数组添加任何内容:
accounts_last_row = 10
accounts_array = []
for (var i = 0; i < accounts_last_row; ++i) {
if ((accounts_range[i][1] == 'test') {
accounts_array.push([ [accounts_range[i][1]],[accounts_range[i][2]] ])
}
}
我想念什么?预先感谢。
答案 0 :(得分:2)
您几乎拥有了,内部数组很简单,括号太多了。
尝试这样:
accounts_array.push( [accounts_range[i][1],accounts_range[i][2]] );
上面的代码将用于添加行。 如果要将数据添加为单列,则必须更改方括号,如下所示:
accounts_array.push( [accounts_range[i][1]],[accounts_range[i][2]] );
答案 1 :(得分:0)
可以使用Array#filter
和Array#push
和apply
来完成此类操作:
const results = [];
const colIndexToTest = /** 0, 1, etc. */;
const requiredValue = /** something */;
SpreadsheetApp.getActive().getSheets().forEach(
function (sheet, sheetIndex) {
var matchedRows = sheet.getDataRange().getValues().filter(
function (row, rowIndex) {
// Return true if this is a row we want.
return row[colIndexToTest] === requiredValue;
});
if (matchedRows.length)
Array.prototype.push.apply(results, matchedRows);
});
// Use Stackdriver to view complex objects properly.
console.log({message: "matching rows from all sheets", results: results});
上面的代码在所有工作表上所有行的给定列中搜索给定值,并将其收集到2d数组中。如果所有行的列数均相同,则此数组将直接使用Range#setValues
进行序列化。
此代码本可以使用map
而不是forEach
和push.apply
,但这将为没有匹配项的工作表索引放置空或未定义的元素。
答案 2 :(得分:0)
我假设如果account-range [i] [1]是'test',则将整个行复制到accounts_array。删除第二个索引。
accounts_last_row = 10
accounts_array = []
for (var i = 0; i < accounts_last_row; ++i) {
if ((accounts_range[i][1] == 'test') {
accounts_array.push(accounts_range[i])
}
}