从所有表中获取所有值

时间:2021-03-25 20:17:21

标签: excel google-sheets

我不能很好地问我的问题。我在这里放了一张我想在谷歌表格、excel 或其他表格中创建的表格。任何人都可以帮助我吗?

<头>
街道名称 数量
僵局马拉巴内 9 僵局马拉巴内 Impasse du Puech Impasse Bimet 街杠杆
Impasse du Puech 1 之二 9 1 之二 6 26
街杠杆 26 5 2 之二 2 28
Impasse Bimet 6 8 1
Impasse Bimet 2 8 之二
僵局马拉巴内 5
Impasse du Puech 2 之二
僵局马拉巴内 8
僵局马拉巴内 8 之二
Impasse du Puech 1
街杠杆 28

5 个答案:

答案 0 :(得分:1)

在 Google 表格中,假设您的原始标题“街道名称”和“编号”位于 A1 和 B1(数据位于 A2:B)中,请将其放入 D2:

=ArrayFormula(TRANSPOSE(TRIM({UNIQUE(FILTER(A2:A,A2:A<>"")),TO_TEXT(SPLIT(TRANSPOSE(TRIM(SPLIT(TEXTJOIN("| ",1,{IFERROR(SUBSTITUTE(VLOOKUP(UNIQUE(FILTER(A2:A,A2:A<>""))&TRANSPOSE(UNIQUE(FILTER(B2:B,B2:B<>""))),A2:A&B2:B,1,FALSE),UNIQUE(FILTER(A2:A,A2:A<>"")),"")),SEQUENCE(COUNTA(UNIQUE(FILTER(A2:A,A2:A<>""))),1,1,0)})&"|","| 1|",0,1))),"|"))})))

这一公式将生成所有结果。在 A2:B 中添加新数据时,无需编辑公式即可添加。

答案 1 :(得分:0)

这个 VBA 脚本做到了。假设您的数据始于 A1 中的 Sheet1

Sub transform()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim first_col As String: first_col = "A"
Dim ws2 As Worksheet
Dim c_last As Range
Dim c As Range
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim key As Variant
Dim arr() As String

Set c_last = ws.Cells(ws.Rows.Count, first_col).End(xlUp)
For Each c In ws.Range(first_col & 2, c_last)
  If dict.Exists(Trim(c)) Then
    dict.Item(Trim(c)) = dict.Item(Trim(c)) & "$" & CStr(c.Offset(, 1))
  Else
    dict.Item(Trim(c)) = CStr(c.Offset(, 1))
  End If
Next

Set ws2 = ws.Parent.Sheets.Add(After:=ws.Parent.Worksheets(ws.Parent.Worksheets.Count))
Set c = ws2.Range("A1")
For Each key In dict.Keys()
  c = key
  arr = Split(dict.Item(key), "$")
  c.Offset(1).Resize(UBound(arr) + 1) = Application.Transpose(arr)
  Set c = c.Offset(, 1)
Next

End Sub

之前:
enter image description here

之后:
enter image description here

答案 2 :(得分:0)

这应该适用于 Google Apps 脚本:

function myFunction() {
  // initialize
  var ss = SpreadsheetApp.getActiveSheet();
  var lr = ss.getLastRow();
  var values = ss.getRange(2,1,lr-1,2).getValues();
  console.log(values.sort());
  var result = [];
  console.log(result);
  var prevCol = '';

  // populate array
  for (i = 0; i < values.length; i++) {
    if (values[i][0] != prevCol) {
      result.push([values[i][0], values[i][1]]);
    }
    else {
      result[result.length-1].push(values[i][1]);
    }
    prevCol = values[i][0];
  }
  console.log(result);

  // transpose array
  var newArray = [];
  for(var i = 0; i < result.length; i++){
      newArray.push([]);
  };

  for(var i = 0; i < result.length; i++){
    for(var j = 0; j < result.length; j++){
      newArray[j].push(result[i][j]);
    };
  };

  // write to range

  var dest = ss.getRange(2,4,newArray[0].length,newArray.length);
  dest.setValues(newArray);
}

答案 3 :(得分:0)

这个问题有点难以理解,但我认为您正在尝试将一个 2 列的表转换为一个包含数据的多列表。

您可以使用数组公式执行此操作。首先,将所有不同的街道名称复制到一行中。在下图中,这是在单元格 F1:I1 中完成的。

单元格 F2 公式:

{=IFERROR(INDEX($B$2:$B$9999, SMALL(IF($F$1=$A$2:$A$9999, ROW($A$2:$A$9999)-ROW($A$2)+1), ROW(1:1))),"")}

您需要按 CTRL+SHIFT+ENTER 来获取这些大括号,使其成为数组公式。根据需要向下拖动它,远远超出您期望的行数。它包含在 IFERROR 处理程序中,如果没有找到更多结果,则显示空白。

其他列的公式类似。您只需要将引用从 $F$1 更改为 $G$1 等等,并重复数组技巧。

另外,如果你有超过 9999 行,只需调整公式中的结束行号。

enter image description here

答案 4 :(得分:0)

对 Carlos 提议的更正(Google 表格):

function myFunction() {
  // initialize
  var ss = SpreadsheetApp.getActiveSheet();
  var lr = ss.getLastRow();
  var values = ss.getRange(2,1,lr-1,2).getValues();
  values.sort();
  var result = [];
  var prevCol = '';

  // populate array
  for (i = 0; i < values.length; i++) {
    if (values[i][0] != prevCol) {
      result.push([values[i][0], values[i][1]]);
    }
    else {
      result[result.length-1].push(values[i][1]);
    }
    prevCol = values[i][0];
  }
  // determine maximum length
  var max = 0 ;
  for(var i = 0; i < result.length; i++){
      max=Math.max(max,result[i].length);
  };

  // complete the array by replacing null values with an empty string 
  for (var i = 0; i < result.length; i ++) {
    for (var j = 0; j < max; j ++) {
      if (result[i][j] == null) {result[i][j] = "";}
    }
  }

  // transpose array
  var result = transpose(result);
  
  // write to range
  ss.getRange(2,4,result.length,result[0].length).setValues(result);
}

function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}