我不能很好地问我的问题。我在这里放了一张我想在谷歌表格、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 |
答案 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
答案 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 行,只需调整公式中的结束行号。
答案 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]; }); });
}