[英]JS pushing arrays to array (concat) in apps script
请注意,这与如何在不创建新数组的情况下将现有JavaScript数组与另一个数组进行扩展不是重复的? 因为我正在寻找一个嵌套数组,而不是简单地用另一个数组扩展一个数组以得到1个数组。 在将此问题标记为重复之前,请先正确阅读该问题。
我正在遍历(Google)工作表中的行以收集值,并希望将每一行作为数组添加到数组中,这将导致如下所示的输出(简化示例说明):
array_main = [[row1_cell1,row1_cell2,row1_cell3],[row2_cell1,row2_cell2,row2_cell3],...]
我首先使用.push尝试了此操作,它添加了值,但不作为数组:
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]] ]) } }
我知道有人问过类似的问题,但其中大多数只是建议使用.concat合并两个数组。 我也尝试过此操作,但它不会向数组添加任何内容:
... if ((accounts_range[i][1] == 'test') { accounts_array.concat( [accounts_range[i][1]],[accounts_range[i][2]] ) } ...
我想念什么? 提前致谢。
您几乎拥有了,内部数组很简单,括号太多了。
尝试这样:
accounts_array.push( [accounts_range[i][1],accounts_range[i][2]] );
上面的代码将用于添加行。 如果要将数据添加为单列,则必须更改方括号,如下所示:
accounts_array.push( [accounts_range[i][1]],[accounts_range[i][2]] );
可以使用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
,但是这将为没有匹配项的工作表索引放置空或未定义的元素。
我假设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])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.