Google Apps 脚本 - 唯一值结果并不唯一

问题描述 投票:0回答:1

我对 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”中,如果存在则忽略它们。但这不是输出显示的内容,代码似乎违背了它自己的逻辑!

如果我能完成这个工作,我稍后会将其转换为带有传递参数的通用函数,以在数据库的其他列上使用。感谢您对此的任何帮助。

google-apps-script google-sheets unique
1个回答
0
投票

唯一排序后发布到工作表中,接下来两个为空列

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.