具有不同类型数据的对象以及如何存储和访问它们?

时间:2013-07-01 05:47:46

标签: arrays types google-apps-script

之前我使用过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()的空白值。

无论如何,我希望我没有太多抨击。任何反馈都表示赞赏。我知道这篇文章很奇怪。

2 个答案:

答案 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()方法,您可以在一个循环中完成。