问题描述
我有工作代码从 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;
}