根据多个列值将 sheet 拆分为多个 sheet
Split sheet into multiple sheets based on multiple column values
我有一台测试设备(制动测功机)可以生成 大量 数据,我想稍微自动化分析过程。
我想要一个 Google 表格模板,我可以将原始数据 copy/paste 放入其中,并自动将该数据过滤到不同的选项卡中。我希望它根据 A 列(循环)进行划分,然后再按 B 列(测试)进行细分。每个测试都有一个独特的选项卡,1:1、1:2、1:3、...1:20...20:1...20:20 等。 ..
我预计每个周期内有 10k-40k 行数据、1-20 个周期和 1-20 个测试,每个测试大约有 250 行数据,因此可能有 100k 行要过滤(奖励积分将奖励给任何能够做到的人运行 'fast').
并非所有数据集都具有相同数量的循环 and/or 每个循环中的测试,因此该模板需要具有一定的灵活性以适应这些变化,即没有用于查找特定值的硬编码行像 Cycle 10 Test 20 因为我可能只有 5 个 Cycles 和每个 Cycle 10 个 Tests 的数据。
Sample data
我看过一些关于将母版 sheet 拆分为多个选项卡的视频和主题。
对我来说不幸的是,它们都基于一列,而我需要两列来过滤我的数据。
我跟着 video 并能够按第一列进行过滤,但我不够熟练 coder 无法重复细分每个 sheets 增加一列。
如果有人愿意帮助我完成添加第二个过滤器的过程,我们将不胜感激!
以下是一些示例数据的第一行和最后几行:
CYCLE
TEST
TIME
RPM
PRESSURE
TEMP
TORQUE
MC
TRAVEL
Mu
INV TORQUE
1
1
0
1615.574
297.804
84.185
-239.611
0.181
0.219
18.781
239.611
1
1
0.01
1622.542
366.04
85.066
-334.298
0.186
0.248
18.791
334.298
1
1
0.021
1616.027
414.561
84.237
-360.269
0.192
0.236
18.802
360.269
1
1
0.032
1615.234
449.322
84.6
-417.892
0.204
0.253
18.813
417.892
1
1
0.043
1615.687
520.937
84.6
-497.428
0.215
0.259
18.824
497.428
1
1
0.053
1615.631
551.997
85.326
-520.694
0.232
0.256
18.834
520.694
7
20
1.876
942.856
789.051
960.281
-1047.147
0.421
0.361
17.879
1047.147
7
20
1.898
934.076
789.051
963.962
-1048.771
0.421
0.361
17.901
1048.771
7
20
1.921
924.559
786.879
962.925
-1129.93
0.42
0.39
17.924
1129.93
7
20
1.943
914.589
786.396
962.199
-1075.283
0.421
0.372
17.946
1075.283
7
20
1.966
905.978
789.212
964.532
-1018.201
0.42
0.351
17.969
1018.201
7
20
1.988
896.631
782.292
965.051
-1124.79
0.421
0.391
17.991
1124.79
function splitData() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Data");
var data = sh.getDataRange().getValues();
var cycle = data[1][0]; // Skip the first line header
var test = data[1][1];
var results = [data[1]]; // Put the first row in result
var i = 0;
function newTab(ss,cycle,test,results) {
try {
var name = "C_"+cycle+"_T_"+test;
var sh = ss.getSheetByName(name);
if( sh ) throw "Error sheet ["+name+"] already exists"
sh = ss.insertSheet(name);
sh.getRange(1,1,results.length,results[0].length).setValues(results);
}
finally {
return;
}
}
for( i=2; i<data.length; i++ ) { // Now we can start with row 2
if( data[i][0] === cycle ) {
if( data[i][1] === test ) {
results.push(data[i]);
}
else { // New test
newTab(ss,cycle,test,results);
test = data[i][1];
results = [data[i]];
}
}
else { // New cycle
newTab(ss,cycle,test,results);
cycle = data[i][0];
test = data[i][1];
results = [data[i]];
}
}
}
catch(err) {
Logger.log(err)
}
}
您还可以导入 TSV 文件:
function importTSV() {
try {
// Its best to get by Id otherwise if you have a lot of files getFilesByName can take a while
var file = DriveApp.getFileById("1EV_uSnOcCUU-k9NinSnI7-aaQ_7xEae4");
var data = file.getBlob().getDataAsString();
data = data.split("\n");
var results = [["CYCLE","TEST","TIME","RPM"]]; // I only have 4 values per row in my test data
for( var i=0; i<data.length; i++ ) {
results.push(data[i].split("\t"));
}
Logger.log(results)
}
catch(err) {
SpreadsheetApp.getUi().alert(err);
}
}
我有一台测试设备(制动测功机)可以生成 大量 数据,我想稍微自动化分析过程。
我想要一个 Google 表格模板,我可以将原始数据 copy/paste 放入其中,并自动将该数据过滤到不同的选项卡中。我希望它根据 A 列(循环)进行划分,然后再按 B 列(测试)进行细分。每个测试都有一个独特的选项卡,1:1、1:2、1:3、...1:20...20:1...20:20 等。 .. 我预计每个周期内有 10k-40k 行数据、1-20 个周期和 1-20 个测试,每个测试大约有 250 行数据,因此可能有 100k 行要过滤(奖励积分将奖励给任何能够做到的人运行 'fast').
并非所有数据集都具有相同数量的循环 and/or 每个循环中的测试,因此该模板需要具有一定的灵活性以适应这些变化,即没有用于查找特定值的硬编码行像 Cycle 10 Test 20 因为我可能只有 5 个 Cycles 和每个 Cycle 10 个 Tests 的数据。
Sample data
我看过一些关于将母版 sheet 拆分为多个选项卡的视频和主题。 对我来说不幸的是,它们都基于一列,而我需要两列来过滤我的数据。 我跟着 video 并能够按第一列进行过滤,但我不够熟练 coder 无法重复细分每个 sheets 增加一列。
如果有人愿意帮助我完成添加第二个过滤器的过程,我们将不胜感激!
以下是一些示例数据的第一行和最后几行:
CYCLE | TEST | TIME | RPM | PRESSURE | TEMP | TORQUE | MC | TRAVEL | Mu | INV TORQUE |
---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1615.574 | 297.804 | 84.185 | -239.611 | 0.181 | 0.219 | 18.781 | 239.611 |
1 | 1 | 0.01 | 1622.542 | 366.04 | 85.066 | -334.298 | 0.186 | 0.248 | 18.791 | 334.298 |
1 | 1 | 0.021 | 1616.027 | 414.561 | 84.237 | -360.269 | 0.192 | 0.236 | 18.802 | 360.269 |
1 | 1 | 0.032 | 1615.234 | 449.322 | 84.6 | -417.892 | 0.204 | 0.253 | 18.813 | 417.892 |
1 | 1 | 0.043 | 1615.687 | 520.937 | 84.6 | -497.428 | 0.215 | 0.259 | 18.824 | 497.428 |
1 | 1 | 0.053 | 1615.631 | 551.997 | 85.326 | -520.694 | 0.232 | 0.256 | 18.834 | 520.694 |
7 | 20 | 1.876 | 942.856 | 789.051 | 960.281 | -1047.147 | 0.421 | 0.361 | 17.879 | 1047.147 |
7 | 20 | 1.898 | 934.076 | 789.051 | 963.962 | -1048.771 | 0.421 | 0.361 | 17.901 | 1048.771 |
7 | 20 | 1.921 | 924.559 | 786.879 | 962.925 | -1129.93 | 0.42 | 0.39 | 17.924 | 1129.93 |
7 | 20 | 1.943 | 914.589 | 786.396 | 962.199 | -1075.283 | 0.421 | 0.372 | 17.946 | 1075.283 |
7 | 20 | 1.966 | 905.978 | 789.212 | 964.532 | -1018.201 | 0.42 | 0.351 | 17.969 | 1018.201 |
7 | 20 | 1.988 | 896.631 | 782.292 | 965.051 | -1124.79 | 0.421 | 0.391 | 17.991 | 1124.79 |
function splitData() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Data");
var data = sh.getDataRange().getValues();
var cycle = data[1][0]; // Skip the first line header
var test = data[1][1];
var results = [data[1]]; // Put the first row in result
var i = 0;
function newTab(ss,cycle,test,results) {
try {
var name = "C_"+cycle+"_T_"+test;
var sh = ss.getSheetByName(name);
if( sh ) throw "Error sheet ["+name+"] already exists"
sh = ss.insertSheet(name);
sh.getRange(1,1,results.length,results[0].length).setValues(results);
}
finally {
return;
}
}
for( i=2; i<data.length; i++ ) { // Now we can start with row 2
if( data[i][0] === cycle ) {
if( data[i][1] === test ) {
results.push(data[i]);
}
else { // New test
newTab(ss,cycle,test,results);
test = data[i][1];
results = [data[i]];
}
}
else { // New cycle
newTab(ss,cycle,test,results);
cycle = data[i][0];
test = data[i][1];
results = [data[i]];
}
}
}
catch(err) {
Logger.log(err)
}
}
您还可以导入 TSV 文件:
function importTSV() {
try {
// Its best to get by Id otherwise if you have a lot of files getFilesByName can take a while
var file = DriveApp.getFileById("1EV_uSnOcCUU-k9NinSnI7-aaQ_7xEae4");
var data = file.getBlob().getDataAsString();
data = data.split("\n");
var results = [["CYCLE","TEST","TIME","RPM"]]; // I only have 4 values per row in my test data
for( var i=0; i<data.length; i++ ) {
results.push(data[i].split("\t"));
}
Logger.log(results)
}
catch(err) {
SpreadsheetApp.getUi().alert(err);
}
}