之前我使用过MATLAB,存储和访问多维矩阵或数组是轻而易举的事。但javascript / AppsScript令我头疼。我知道,对于GAS,人们必须伪造一个带有for循环的2D数组并将数组放入数组中。
同时,array[i][j]
的形式正常。另一次我根本无法访问它。
我想我需要快速总结数组如何在GAS中工作。特别是多维阵列...
话虽如此,这是我需要回答的具体情况。
我有这样的事情:(有目的地将第二行留下一个数据。行不一定具有相同的长度。)
A B C D E F G H I
abc 456 789 012 345 678
def 234 567 890 123
ghi 012 345 678 901 234
第一列有文字,其余是数字。基本上,由于这里说的原因太久了,我需要两个数组:一个是第一列的值,另一个是每行有一个数组“数组”的数组。
这样的事情:
firstArray = [abc, def, ghi];
secondArray = [[456, 789, 012, 345, 678], [234, 567, 890, 123], [012, 345, 678, 901, 234]];
然后要访问它们,我有一个双for loop
设置:
for (var ii = 0; ii < firstArray.length; ii++) {
do something with firstArray[ii];
for (var jj = 0; jj < secondArray[ii].length) {
do something with secondArray[ii][jj];
}
}
要制作第二个数组,我使用的是getValues()
方法。我做这样的事情:
sh.getRange('B1:1').getValues();
我必须做'B1:1',因为我似乎无法为lastColumn()
找到RANGE
方法。它只适用于SHEET
。这会导致在使用secondArray
时抓取getValues()
的空白值。
无论如何,我希望我没有太多抨击。任何反馈都表示赞赏。我知道这篇文章很奇怪。
答案 0 :(得分:2)
我希望我在这里回答你的问题。我相信你想在电子表格中使用它:
A B C D E F G H I
abc 456 789 012 345 678
def 234 567 890 123
ghi 012 345 678 901 234
在Javascript数组中:
firstArray = [abc, def, ghi];
secondArray = [[456, 789, 012, 345, 678], [234, 567, 890, 123], [012, 345, 678, 901, 234]];
最佳做法是尽可能少地使用Google Apps脚本电子表格API方法。为此,我将通过一次getDataRange()
调用获取所有数据:
var data = sh.getDataRange().getValues();
正如您所提到的,getValues()
将始终返回一个数组数组,其中外部数组表示行,内部数组是每行中的单元格。所以要提取到你的新数组:
var firstArray = [], secondArray = [];
for (var i = 0, length = data.length; i < length; i++) {
firstArray.push(data[i][0]);
secondArray[i] = [];
for (var j = 1, width = data[0].length; j < width; j++) {
if (!data[i][j]) break; //assumes no blank cells *within* the data
secondArray[i].push(data[i][j]);
}
}
请注意,map
Javascript方法可能会提供更简洁的方法,但我会将其留给更有见识的人。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
答案 1 :(得分:2)
我是这样做的。基本上,将所有工作表读入一个大的2D阵列并从那里进行操作。
var data = sheet.getDataRange().getValues();
var colA = new Array();
var remainingCols = new Array();
for (var i = 0 ; i < data.length ; i++){
colA.push(data[i][0]);
remainingCols.push(data[i].slice(1));
}
See here获取slice()方法的文档。使用slice()方法,您可以在一个循环中完成。