Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有更好的方法根据条件合并行数据(谷歌应用程序脚本)?_Javascript_Arrays_Performance_Google Apps Script_Optimization - Fatal编程技术网

Javascript 有没有更好的方法根据条件合并行数据(谷歌应用程序脚本)?

Javascript 有没有更好的方法根据条件合并行数据(谷歌应用程序脚本)?,javascript,arrays,performance,google-apps-script,optimization,Javascript,Arrays,Performance,Google Apps Script,Optimization,好吧…让我先说我是自学的谷歌应用程序脚本…说够了,对吧!?下面的脚本正在运行,但我想对其进行优化,或者想出另一种方法来实现相同的结果。该脚本获取18000行和86列数据,并根据id列表将它们组合成一行。id列表大约有13000行长。简短的版本是这样的…它通过id过滤数据,然后检查每一列中最后一行提交的数据,并返回该单元格。例如: //sample data [[311112, 1, 2, 4, 5,"","","","&quo

好吧…让我先说我是自学的谷歌应用程序脚本…说够了,对吧!?下面的脚本正在运行,但我想对其进行优化,或者想出另一种方法来实现相同的结果。该脚本获取18000行和86列数据,并根据id列表将它们组合成一行。id列表大约有13000行长。简短的版本是这样的…它通过id过滤数据,然后检查每一列中最后一行提交的数据,并返回该单元格。例如:

//sample data
[[311112, 1, 2, 4, 5,"","","","","","", 2, 3],
[323223,"","","","","", 2, 4, 4,"","","",""],
[321321, 1, 2, 4, 5,"","","","","","", 2, 3],
[311112, 4, 1, 6, 7,"", 3,"", 3,"","", 5, 3],
[321233,"","","","","","", 4, 3, 1, 5,"",""],
[321321,"","","","","","","","", 1 ,4,"",""],
[323223,"","","","","", 2, 3,"","","","",""],
[323153,"", 2, 3, 6,"","","","","","","",""],
[321321,"","","","","", 2, 3,"","","","",""],
[321321,"", 5, 3,"", 1,"","","","","","",""]]

//filtered Data by id 321321
[[321321, 1, 2, 4, 5,"","","","","","", 2, 3],
[321321,"","","","","","","","", 1, 4,"",""],
[321321,"","","","","", 2, 3,"","","","",""],
[321321,"", 5, 3,"", 1,"","","","","","",""]]

// returned row is getting the last nonempty value for each column from the filtered data.

[[321321, 1, 5, 3, 5, 1, 2, 3,"", 1, 4, 2, 3]]
完成脚本大约需要16-18分钟。是否有更好的方法来完成此任务或任何优化建议?

function combineR(startRow, startRange) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var testSheet = ss.getSheetByName('Raw Scores');
  var cSheet = ss.getSheetByName('Combined Scores');
  var gradingResults = testSheet.getRange(1, 1, testSheet.getLastRow(), testSheet.getLastColumn()).getValues();

  if (startRow > cSheet.getLastRow()) {
    return;
  }

  if (startRow + startRange > cSheet.getLastRow()) {
    startRange = cSheet.getLastRow() - startRow;
  }

  var sID = cSheet.getRange(startRow, 2, startRange).getValues();
  var maxScores = [];
  for (var x = 0; x < sID.length; x++) {
    var filtered = gradingResults.filter(function (dataRow) {
      return dataRow[0] === sID[x][0];
    });

    if (isFinite(filtered)) {
      maxScores.push(['', '', '', '', '', '', '', '', '', '',
        '', '', '', '', '', '', '', '', '', '',
        '', '', '', '', '', '', '', '', '', '',
        '', '', '', '', '', '', '', '', '', '',
        '', '', '', '', '']);
      continue;
    } else {
      maxScores.push(['', getMaxLetter(filtered, 3), lastGraded(filtered, 4), lastGraded(filtered, 5), lastGraded(filtered, 6), lastGraded(filtered, 7), lastGraded(filtered, 8), lastGraded(filtered, 9), lastGraded(filtered, 10), lastGraded(filtered, 11),
        lastGraded(filtered, 12), lastGraded(filtered, 13), lastGraded(filtered, 14), lastGraded(filtered, 15), lastGraded(filtered, 16), lastGraded(filtered, 17), lastGraded(filtered, 18), lastGraded(filtered, 19), lastGraded(filtered, 20), lastGraded(filtered, 21),
        lastGraded(filtered, 22), lastGraded(filtered, 23), lastGraded(filtered, 24), lastGraded(filtered, 25), lastGraded(filtered, 26), lastGraded(filtered, 27), lastGraded(filtered, 28), lastGraded(filtered, 29), lastGraded(filtered, 30), lastGraded(filtered, 31),
        lastGraded(filtered, 32), lastGraded(filtered, 33), lastGraded(filtered, 34), lastGraded(filtered, 35), lastGraded(filtered, 36), lastGraded(filtered, 37), lastGraded(filtered, 38), lastGraded(filtered, 39), lastGraded(filtered, 40), lastGraded(filtered, 41),
        lastGraded(filtered, 42), lastGraded(filtered, 43), lastGraded(filtered, 44), lastGraded(filtered, 45), lastGraded(filtered, 46)]);
    }
  }
  cSheet.getRange(startRow, 11, maxScores.length, maxScores[0].length).setValues(maxScores)
}

function getMaxLetter(arr, idx) {
  var letter = arr.map(function (e) { return e[idx] }).sort().pop();
  return letter;
}

function lastGraded(arr, idx) {
  var newArray = arr.map(function (e) { return e[idx] });
  newArray.reverse();
  for (var x = 0; x < newArray.length; x++) {
    if (typeof newArray[x] == 'number') {
      return newArray[x];
    }
  }
  return '';
}
功能组合器(startRow、startRange){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheets=ss.getSheets();
var testSheet=ss.getSheetByName(“原始分数”);
var cSheet=ss.getSheetByName(‘综合分数’);
var gradingResults=testSheet.getRange(1,1,testSheet.getLastRow(),testSheet.getLastColumn()).getValues();
如果(startRow>cSheet.getLastRow()){
返回;
}
如果(startRow+startRange>cSheet.getLastRow()){
startRange=cSheet.getLastRow()-startRow;
}
var sID=cSheet.getRange(startRow,2,startRange).getValues();
var maxScores=[];
对于(变量x=0;x
列A具有需要合并的重复ID

列B具有作为最终合并产品的唯一值

问题: 脚本似乎有各种问题,但主要问题似乎是多次使用各种索引调用
lastcraded
函数。这会
映射
反转
以及每个索引的所有其他内容,并会花费时间

解决方案: 根据您的样本数据,我提出以下方法:

  • 获取2D数组中的所有输入数据

  • 将输入的数据保存到。地图将每个
    id
    作为
    ,并将与该
    匹配的所有行作为每个
    键的2D
    数组
    。这将以内存为代价大大提高性能/速度。这比按每个id筛选数组要好,因为

    • 只能循环输入数组一次
    • arr.filter
      必须为每个id循环数组
  • 一旦缩减为
    映射
    ,则在
    映射
    中的每个
    数组
    中反向循环最后一行中的每个元素,以查找非空元素

示例代码段:
const arrMain=
//样本数据
[
[311112, 1, 2, 4, 5, '', '', '', '', '', '', 2, 3],
[323223, '', '', '', '', '', 2, 4, 4, '', '', '', ''],
[321321, 1, 2, 4, 5, '', '', '', '', '', '', 2, 3],
[311112, 4, 1, 6, 7, '', 3, '', 3, '', '', 5, 3],
[321233, '', '', '', '', '', '', 4, 3, 1, 5, '', ''],
[321321, '', '', '', '', '', '', '', '', 1, 4, '', ''],
[323223, '', '', '', '', '', 2, 3, '', '', '', '', ''],
[323153, '', 2, 3, 6, '', '', '', '', '', '', '', ''],
[321321, '', '', '', '', '', 2, 3, '', '', '', '', ''],
[321321, '', 5, 3, '', 1, '', '', '', '', '', '', ''],
];
//将输入数组减少为id=>行的映射
常量映射=arrMain.reduce((映射,行)=>{
如果(!map.has(行[0])map.set(行[0],[row]);
else map.get(行[0]).push(行);
返回图;
},新地图());
常数输出=[];
map.forEach(arr2d=>{
常数l=arr2d.length-1,
lastRow=arr2d[l]。切片(0);
//迭代此id的列元素的最后一行
对于(设j=0;j=0;--i){
如果(arr2d[i][j]!=''){
lastRow[j]=arr2d[i][j];
打破
}
}
}
}
向外推(最后一排);
});
控制台。注销示例sc