【发布时间】:2021-01-04 14:00:22
【问题描述】:
好的...首先我要说我是自学的 Google Apps 脚本...说得够多了,对吧!?下面的脚本正在运行,但我想优化它或想出另一种方法来实现相同的结果。该脚本采用 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 '';
}
【问题讨论】:
-
请提供两张纸的截图示例。
-
在您的示例中,我不了解示例数据如何产生返回的行。你能澄清一下吗?也许屏幕截图会对此有所帮助。
-
目前,这是通过按 Id 过滤数据然后获取该特定列并构建一个查找最后一个非空条目的列表来完成的。在我的示例中,除第一个元素外,每个集合中的第一个元素都是空白的,因此它返回 1,因为它是“最后一个”包含数据的非空提交。清如泥……对吧?
-
@TheMaster 添加了截图。
-
我能理解你的top sample table的逻辑。但不幸的是,我无法理解您的 2 张图片的差异。可以问一下具体情况吗?
标签: javascript arrays performance google-apps-script optimization