Google Apps Script 获得独特价值的更好方式

问题描述

我有工作代码从 Google 电子表格中的两个不相邻列中获取数据,在第一列中查找唯一值,如果唯一,则创建一个新数组,其中包含第一列中的唯一值和对应的值第二列。问题是,我使用的数据已经有点长(413 行),而且随着时间的推移只会变得更长。代码运行大约需要 1-2 分钟。我一直在寻找一种更短的方法来做到这一点,我遇到了 filter() 和 map() 数组函数,它们据说比 for 循环更快,但我无法正确实现它们。对这些或更快的方法的任何帮助将不胜感激。我现在拥有的代码如下。

function getkhanassignments(rows) {

  var assignmentsraw = [];
  var temparray = [];
  var prevIoUsassignment = datasheet.getRange(50,1).getValue();
  for(i=0,j=0;i<rows-1;i++) {
    if(datasheet.getRange(50+i,1).getValue() != prevIoUsassignment) {   
      prevIoUsassignment = datasheet.getRange(50+i,1).getValue();
      assignmentsraw[j] = new Array(2);
      assignmentsraw[j][0] = datasheet.getRange(50+i,1).getValue();
      assignmentsraw[j][1] = datasheet.getRange(50+i,8).getValue();
      j++;
    }
  }
  Logger.log(assignmentsraw);
  return assignmentsraw;
}

我在其他地方找到的答案只涉及从一维数组中获取唯一值,而我需要一维中的唯一值与另一个一维数组中的相应值相结合。输出应该是一个二维数组,其中第一列的值是唯一的,第二列的值是对应的。

解决方法

解决方案:

在 Google Apps 脚本中循环遍历范围的最佳做法是将范围值转储到一个二维数组中,循环遍历该数组,然后将输出数组返回到 Google 表格。

这样,就不会在循环内调用 Sheets API。

示例代码:

function getkhanassignments(rows) {

  var assignmentsraw = [];

  var table1 = datasheet.getRange(50,1,rows).getValues();
  var table2 = datasheet.getRange(50,8,rows).getValues();

  var previousassignment = table1[0][0];
  assignmentsraw.push([table1[0][0],table2[0][0]]);
  for(i=0; i<rows; i++) {
    if (table1[i][0] != previousassignment) {
      assignmentsraw.push([table1[i][0],table2[i][0]]);
      previousassignment = table1[i][0];
    }
  }
  Logger.log(assignmentsraw);
  return assignmentsraw;
}

参考:

Class Range

push()