将逗号分隔的数据从单元格拆分为多个新行而不复制数据
Splitting comma-separated data from cell into multiple new rows without duplicating data
我有一个包含数千个条目的数据列表,我需要将这些条目导入管理系统以获取 google 表格文件。
目前我有这样的东西:
A
B
C
1
Dermazone
Medical Center
Dermal, laser hair removal, massage
2
3Dental
Clinic
Orthodontics, General Practitioner, Prosthodontics
我想实现这样的目标:
A
B
C
1
Dermazone
Medical Center
Dermal
2
Laser Hair Removal
3
Massage
4
3Dental
Clinic
Orthodontics
5
General Practitioner
6
Prosthodontics
我研究了一下,发现了这个脚本
function result(range) {
var splitCol = 1; // split on column B
var output2 = [];
for(var i=0, iLen=range.length; i<iLen; i++) {
var s = range[i][splitCol].split("\n");
for(var j=0, jLen=s.length; j<jLen; j++) {
var output1 = [];
for(var k=0, kLen=range[0].length; k<kLen; k++) {
if(k == splitCol) {
output1.push(s[j]);
} else {
output1.push(range[i][k]);
}
}
output2.push(output1);
}
}
return output2;
}
但是我有两个问题:
- 我不希望该行中的其他数据出现重复条目(我只希望将我的 C 列拆分为新行)
- 这个脚本不适用于大量数据(我有大约 12k 行可以应用它)
请协助我解决这些问题,感谢您的帮助。
谢谢!
在您的情况下,下面的示例脚本怎么样?
示例脚本:
根据您的脚本,我认为您可能希望将该函数用作自定义函数。因此,在本次修改中,请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并将=result(A1:C2)
的自定义函数放入单元格中。
function result(values) {
return values.flatMap(([a, b, c]) => c.split(",").map((e, i) => i == 0 ? [a, b, e.trim()] : [null, null, e.trim()]));
}
如果您想通过运行脚本编辑器使用此脚本,请使用以下脚本。
function result() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var srcSheet = ss.getSheetByName("Sheet1"); // Please set the source sheet name.
var dstSheet = ss.getSheetByName("Sheet2"); // Please set the destination sheet name.
var values = srcSheet.getDataRange().getValues();
var res = values.flatMap(([a, b, c]) => c.split(",").map((e, i) => i == 0 ? [a, b, e.trim()] : [null, null, e.trim()]));
dstSheet.getRange(1, 1, res.length, res[0].length).setValues(res);
}
测试:
当上述脚本为运行时,得到如下结果
参考:
我有一个包含数千个条目的数据列表,我需要将这些条目导入管理系统以获取 google 表格文件。 目前我有这样的东西:
A | B | C | |
---|---|---|---|
1 | Dermazone | Medical Center | Dermal, laser hair removal, massage |
2 | 3Dental | Clinic | Orthodontics, General Practitioner, Prosthodontics |
我想实现这样的目标:
A | B | C | |
---|---|---|---|
1 | Dermazone | Medical Center | Dermal |
2 | Laser Hair Removal | ||
3 | Massage | ||
4 | 3Dental | Clinic | Orthodontics |
5 | General Practitioner | ||
6 | Prosthodontics |
我研究了一下,发现了这个脚本
function result(range) {
var splitCol = 1; // split on column B
var output2 = [];
for(var i=0, iLen=range.length; i<iLen; i++) {
var s = range[i][splitCol].split("\n");
for(var j=0, jLen=s.length; j<jLen; j++) {
var output1 = [];
for(var k=0, kLen=range[0].length; k<kLen; k++) {
if(k == splitCol) {
output1.push(s[j]);
} else {
output1.push(range[i][k]);
}
}
output2.push(output1);
}
}
return output2;
}
但是我有两个问题:
- 我不希望该行中的其他数据出现重复条目(我只希望将我的 C 列拆分为新行)
- 这个脚本不适用于大量数据(我有大约 12k 行可以应用它)
请协助我解决这些问题,感谢您的帮助。 谢谢!
在您的情况下,下面的示例脚本怎么样?
示例脚本:
根据您的脚本,我认为您可能希望将该函数用作自定义函数。因此,在本次修改中,请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并将=result(A1:C2)
的自定义函数放入单元格中。
function result(values) {
return values.flatMap(([a, b, c]) => c.split(",").map((e, i) => i == 0 ? [a, b, e.trim()] : [null, null, e.trim()]));
}
如果您想通过运行脚本编辑器使用此脚本,请使用以下脚本。
function result() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var srcSheet = ss.getSheetByName("Sheet1"); // Please set the source sheet name. var dstSheet = ss.getSheetByName("Sheet2"); // Please set the destination sheet name. var values = srcSheet.getDataRange().getValues(); var res = values.flatMap(([a, b, c]) => c.split(",").map((e, i) => i == 0 ? [a, b, e.trim()] : [null, null, e.trim()])); dstSheet.getRange(1, 1, res.length, res[0].length).setValues(res); }
测试:
当上述脚本为运行时,得到如下结果