1

我以前使用过 MATLAB,存储和访问多维矩阵或数组是轻而易举的事。但是 javascript/AppsScript 让我很头疼。我知道使用 GAS,必须使用 for 循环伪造一个二维数组并将数组放入数组中。

有一次,这种形式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().

无论如何,我希望我没有吹嘘太多。任何反馈表示赞赏。我知道这篇文章的结构很奇怪。

4

2 回答 2

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 Script 电子表格 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]);
  }
}

请注意,mapJavascript 方法可能会提供一种更简洁的方式来执行此操作,但我会将其留给更有知识的人。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

于 2013-07-01T06:10:24.837 回答
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));
}

有关slice() 方法的文档,请参见此处。使用 slice() 方法,您可以在一个循环中完成。

于 2013-07-01T06:12:03.050 回答