Javascript 有没有更好的方法根据条件合并行数据(谷歌应用程序脚本)?
好吧…让我先说我是自学的谷歌应用程序脚本…说够了,对吧!?下面的脚本正在运行,但我想对其进行优化,或者想出另一种方法来实现相同的结果。该脚本获取18000行和86列数据,并根据id列表将它们组合成一行。id列表大约有13000行长。简短的版本是这样的…它通过id过滤数据,然后检查每一列中最后一行提交的数据,并返回该单元格。例如: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
//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筛选数组要好,因为数组
- 只能循环输入数组一次
- 而
必须为每个id循环数组arr.filter
- 一旦缩减为
,则在映射
中的每个映射
中反向循环最后一行中的每个元素,以查找非空元素数组
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