我对 Google Apps 脚本相当陌生,但我正在努力使用一些脚本来总结我正在开发的一些 Google Sheets 数据库中的数据。它还将有助于填充每个电子表格的仪表板。
我以这张表为例: 奥地利TEST2
首先,我想获取工作表“数据”的 L 列中的数据,找到唯一的非空白值,然后计算每个值的数量,按降序对列表进行排序并将其写入列“摘要”表的 C 和 D。
这是我的代码:
// ************ Operators
// load non-empty values into an array
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data").getRange("L2:L").getValues().filter(String);
var uniqueValues = [];
// Find the unique values in the data.
for (var i = 0; i < data.length; i++) {
if (!uniqueValues.includes(data[i][0])) {
uniqueValues.push([data[i][0], 0]);
}
}
// Count the occurrences of each unique value.
for (var i = 0; i < data.length; i++) {
for (var j = 0; j < uniqueValues.length; j++) {
if (uniqueValues[j][0] === data[i][0]) {
uniqueValues[j][1]++;
}
}
}
// Sort the array according to column 2.
uniqueValues.sort(function(a, b) {
return b[1] - a[1];
});
// Insert header row - both ways give errors!!
//uniqueValues2[2][uniqueValues.length+1] = uniqueValues;
//var length = uniqueValues.unshift('Operator','Qty');
// 1st row, 1st col, no of rows, no of cols
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Summary").getRange(2,3,uniqueValues.length,2).setValues(uniqueValues);
这是我的 L 列数据: 阿尼塞克航空有限公司 奥地利航空 波罗的海喷气航空公司 易捷航空 易捷航空 易捷航空 易捷航空 易捷航空 易捷航空 易捷航空 易捷航空 易捷航空 欧洲易捷航空 欧洲易捷航空 欧洲易捷航空 欧洲易捷航空 飞迈 劳达运动有限公司 MHS 航空有限公司 天梯航空 尝试飞翔
我希望得到: 易捷航空 9 易捷欧洲 4 阿尼塞克航空有限公司 1 奥地利航空 1 波罗的海喷气航空公司 1 飞迈1 劳达运动有限公司 1 MHS 航空有限公司 1 天梯航空 1 尝试飞行 1
但我实际上得到: 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷航空 9 易捷欧洲 4 易捷欧洲 4 易捷欧洲 4 易捷欧洲 4 阿尼塞克航空有限公司 1 奥地利航空 1 波罗的海喷气航空公司 1 飞迈1 劳达运动有限公司 1 MHS 航空有限公司 1 天梯航空 1 尝试飞行 1
据我所知,代码逻辑是正确的,如果新值尚不存在,则应将新值从“data”加载到“uniqueValues”中,如果存在则忽略它们。但这不是输出显示的内容,代码似乎违背了它自己的逻辑!
如果我能完成这个工作,我稍后会将其转换为带有传递参数的通用函数,以在数据库的其他列上使用。感谢您对此的任何帮助。
唯一排序后发布到工作表中,接下来两个为空列
function myfunk() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet3");
const osh = ss.getSheetByName("Sheet4");
const data = sh.getRange("L2:L" + sh.getLastRow()).getValues().flat();
let uA = [...new Set(data)].sort((a,b) => {return b - a}).filter(e => e).map(e => [e,'']);
osh.getRange(2,3,uA.length,uA[0].length).setValues(uA);
}