根据多个列值将 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);
  }
}