【问题标题】:Google sheets unique multiple columns and output multiple columns谷歌表格唯一的多列并输出多列
【发布时间】:2018-06-15 19:32:02
【问题描述】:

我需要一些帮助来解决这个问题。我有多列数据,我想这样做,以便我只保留唯一值并将项目返回到它们各自的列。

1 2 3 6
1 1 4 7  
2 3 5 8

最终会是这样:

1 3 4 6
2   5 7
      8

现在我可以使用 =unique() 函数处理一列,但我希望能够放入一列新数据,它只会将其中的唯一项目吐出到新表中。

【问题讨论】:

    标签: javascript google-sheets unique


    【解决方案1】:

    这是对数组公式的尝试:假设单元格不包含负数、逗号或竖线符号。

    =ArrayFormula(transpose(split(transpose(split(join(",",text(unique(transpose(split(textjoin(",",true,{transpose(A1:D3),-transpose(column(A1:D3))}),","))),"0;|")),"|")),",")))
    

    也适用于全列引用

    =ArrayFormula(transpose(split(transpose(split(join(",",text(unique(transpose(split(textjoin(",",true,{transpose(A:D),-transpose(column(A:D))}),","))),"0;|")),"|")),",")))
    

    【讨论】:

      【解决方案2】:
      var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet5");
      var sheet2 = SpreadsheetApp.getActive().getSheetByName("Sheet6");
      var info = sheet.getDataRange().getValues();
      var lastRow = sheet.getLastRow();
      var lastCol = sheet.getLastColumn();
      var seen = {}; // make object acts as a hash table
      var data = info; // make array same size as original array that has the entire sheet
      
      for (var x = 0; x < info[x].length; x++){
          for (var i = 0; i < info.length; i++) {
              if (!(info[i][x] in seen)) { // if item is not in seen
                  data[i][x] = info[i][x]; // put item in location
                  seen[data[i][x]] = true;}
              else {
                 data[i][x] = "";}}} // if its not then add blank item to array
      

      上一个答案的连接限制为 50,000 个字符,因此它有自己的限制。此选项有助于更大的数据集。我认为它仍然可以调整和改进

      【讨论】:

      • 整洁的代码。是的,您是对的,我的答案(以及其他基于拆分/连接模式的答案)将受到单个单元格中字符串的最大长度的限制。在查看您的答案时,我学到的是 JavaScript 中的数组是关联的(不一定以哈希表的形式实现),因此与 Java 不同,您可以使用任何数据类型作为数组的“下标”,而不仅仅是整数。跨度>
      【解决方案3】:
      1. 将这些脚本粘贴到脚本编辑器中。

      function onOpen() {
          SpreadsheetApp.getUi().createMenu('My Menu')
              .addItem('Show uniques', 'onlyShowUniques')
              .addToUi()
      }
      
      function onlyShowUniques() {
          var r, d, u, t, row, i, j;
          r = SpreadsheetApp.getActive().getActiveRange();
          d = transpose(r.getValues());
          u = [];
          t = [];
          for (var i = 0, rl = d.length; i < rl; i++) {
              row = []
              for (var j = 0, cl = d[0].length; j < cl; j++) {
                  if (d[i][j] && (!~u.indexOf(d[i][j]) || i == 0 && j == 0)) {
                      u.push(d[i][j])
                      row.push(d[i][j])
                  } else {
                      row.push(null)
                  }
                  row.sort(function (a, b) {
                      return (a === null) - (b === null) || +(a > b) || -(a < b);
                  })
              }
              t.push(row)
          }
          r.setValues(transpose(t))
      }
      
      function transpose(array) {
          return Object.keys(array[0])
              .map(function (col) {
                  return array.map(function (row) {
                      return row[col];
                  });
              });
      }
      1. 重新打开电子表格并查看是否创建了额外的菜单项(“我的菜单”)。

      2. 选择要清除重复项的范围。

      3. 转到菜单项并选择“显示唯一性”。

      4. 看看这是否带来了预期的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        • 1970-01-01
        • 2021-09-01
        • 2017-08-06
        • 1970-01-01
        • 2020-03-09
        • 2022-12-31
        相关资源
        最近更新 更多