【问题标题】:Objects with different types of data and how to store and access them?具有不同类型数据的对象以及如何存储和访问它们?
【发布时间】:2013-07-01 05:47:45
【问题描述】:

我之前使用过 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”,因为我似乎无法为 RANGE 找到 lastColumn() 方法。它仅适用于SHEET。这会导致在使用getValues() 时抓取secondArray 的空白值。

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

【问题讨论】:

    标签: arrays types google-apps-script


    【解决方案1】:

    我希望我在这里回答你的问题。我相信您想在电子表格中从此开始:

     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]);
      }
    }
    

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

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

    【讨论】:

      【解决方案2】:

      这就是我的做法。基本上,将所有工作表读入一个大的二维数组并从那里进行操作。

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

      【讨论】:

      • 这太棒了,可以将我的时间缩短一半。我已为您链接到的文档添加了书签。我仍然选择了 AdamL 的帖子接受的答案,但这只是因为它还解决了 secondArray 数组中的变化。我将使用 splice 方法以及来自您的链接和 AdamL 的其他方法来完成我的代码。非常感谢!
      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 2012-03-07
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多