【问题标题】:Creating sheets with from master sheet从主工作表创建工作表
【发布时间】:2020-12-13 16:39:44
【问题描述】:
  1. 我有一张名为表单响应的表单,它从 google 获取输入 表格,然后我创建了带有 C 列名称的表格,即 员工代码并附加表单响应中的所有相应行 到新创建的工作表。
  2. 现在我有名称为员工代码的工作表(在工作表的 c 列中)。然后我想从这个主工作表(名称为员工代码的工作表)创建辅助工作表,其名称使用附加到员工代码的 E 列值。例如:如果 Emp 代码是 10003825 并且 E 列中的值是 ASR,工作表名称应为 10001515ASR。
  3. 在 E 列中只有 4 个值 ADC、ASR ACC、RSR。让主工作表(名称为员工代码的工作表)始终保留 ADC 行,而当其他包含 ASR、ACC、RSR 的行出现时,将相应的行附加到新创建的工作表中(即,如果 ASR 行转到 10001515ASR)。
  4. 我已经展示了我的当前工作表和预期输出

我开发的代码如下图:

 function switchSheet(){
    var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheets = activeSpreadsheet.getSheets();
    for (var i = 1; i < sheets.length; i++) {
       var p =  sheets[i].getSheetName();
       sheetCreateChannel(p);
      }
    }
 function sheetCreateChannel(ss){
   var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
   var sheet1 = activeSpreadsheet.getSheetByName(ss);
   var getNames = sheet1.getDataRange().getValues();
   getNames.shift();
   var sheets = activeSpreadsheet.getSheets();
   var sheetsObj = {};
      for (var i = 0; i < sheets.length; i++) {
       sheetsObj[sheets[i].getSheetName()] = sheets[i];
       for (var i = 0; i < getNames.length; i++) {
         var r = getNames[i];
         if (r[4].toString()== "ASR"&& !((ss+(r[4])) in sheetsObj)) {
                    var newSheet = activeSpreadsheet.insertSheet(ss + "ASR");
                    sheetsObj[ss+"ASR"] = newSheet;
                   }
         else if (r[4].toString()== "ACC"&&!((ss+(r[4])) in sheetsObj)) {
              var newSheet = activeSpreadsheet.insertSheet(ss + "ACC");
              sheetsObj[ss+"ACC"] = newSheet;
                   }
         else if (r[4].toString()== "RSR"&& !((ss+(r[4])) in sheetsObj)) {
              var newSheet = activeSpreadsheet.insertSheet(ss + "RSR");
              sheetsObj[ss+"RSR"] = newSheet;
              }
         else  {
              break;
              }
            }
           } 
         var deleteRows = 0;
           for (var i = 0; i < getNames.length; i++) {
            var r = getNames[i];
             if (r[4].toString() != "") {
              if ((ss+(r[4])) in sheetsObj) {
               var Q =ss+(r[4]);
                sheetsObj[Q].appendRow(r);
             } 
          deleteRows = i + 2;
          }    
         }
        sheet1.getRange(2, 1, deleteRows - 1, sheet1.getLastColumn()).clearContent();
       } 

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。我能问一下您当前的剧本问题吗?
  • @Tanaike 我使用 C 列值从我的主工作表创建了一个工作表。现在我想使用使用 C 列创建的工作表作为主工作表创建工作表。我附上了我的工作表的屏幕截图
  • 感谢您的回复。不幸的是,从您的回复和更新问题中,我仍然无法理解您当前的问题和目标。我为此道歉。你能给我一点时间了解一下吗?
  • 我的英语很好,但我也听不懂这个要求。您声明您希望工作表名称为 EmployeeID + 列 E。好的...有什么问题?您可能会遇到一些重复的工作表名称。如果您能够正确执行您的代码,它会是什么样子?也许分享一个示例文件?
  • @Tanaike 问题是我必须从辅助工作表创建工作表,例如这里的 10001515 工作表来创建工作表 10001515ASR、10001515ACC、10001515RSR 但不是 10001515ADC。然后将所有与 ASR 相关的行附加到 10001515 到 10001515ASR 等等,但对于与 ADC 相关的所有行,让这些行保留在 10001515 中。每当更新主表时,此表也会在代码运行时更新,它不应该创建 10001515ASRASR 就像我每次更新时都会遇到这样的错误

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

此代码适用于我的上述问题

 function sheetCreate(){
   var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
   var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1");
   var getNames = sheet1.getDataRange().getValues();
   getNames.shift();
   var sheets = activeSpreadsheet.getSheets();
   var sheetsObj = {};
    for (var i = 0; i < sheets.length; i++) {
     sheetsObj[sheets[i].getSheetName()] = sheets[i];
     }
   var deleteRows = 0;
    for (var i = 0; i < getNames.length; i++) {
     var r = getNames[i];
     var N=r[2].toString()+r[4].toString(); 
        if (N != "") {
         if (N in sheetsObj) {
          sheetsObj[N].appendRow(r);
        } else {
          var newSheet = activeSpreadsheet.insertSheet((N));
          var cell1 = newSheet.getRange("A1").setValue("Timestamp");
          var cell2 = newSheet.getRange("B1").setValue("Score");
          var cell3 = newSheet.getRange("C1").setValue("Employee ID");
          var cell4 = newSheet.getRange("D1").setValue("Name of the ATCO");
          var cell5 = newSheet.getRange("E1").setValue("The channel on which duty is performed ");
          var cell6 = newSheet.getRange("F1").setValue("DATE on which duty  is performed");
          var cell7 = newSheet.getRange("G1").setValue("Total duration of duty done");
          newSheet.appendRow(r);
          sheetsObj[N] = newSheet;
          }
        deleteRows = i + 2;
        }    
       }
      sheet1.getRange(2, 1, deleteRows - 1, sheet1.getLastColumn()).clearContent();
     }   

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多