首页 > 解决方案 > 创建一个具有相应列名的新工作表?

问题描述

我有一张工作表,其中 B 列是员工代码我需要在看到新员工代码时创建一个新工作表,并将相应的行附加到与员工代码对应的新工作表中,并删除主工作表中的相应行。每当出现相同的员工代码时,我需要将行附加到相应的员工代码表中。例如,emp 代码 10003810 在此工作表中出现三次,第一个 10003810 我创建了一个名为 10003810 的工作表并将行附加到此工作表,每当 10003810 出现时,我将相应的附加到工作表 10003810。我尝试的代码是

   function sheetCreate(){
   var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
   var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1")
   var getNames = sheet1.getRange("B2:B").getValues();
   var erg = sheet1.getDataRange();                                                
   var evA=erg.getValues();                                                   
   var d=0;

   for (var i =1;i<=getNames.length; i++) {
      var copy = getNames[i];
      var newSheet = activeSpreadsheet.insertSheet();
      newSheet.setName(copy);
      newSheet.appendRow(copy);
      sheet1.deleteRow(i+1-d);
      d++;                                                                   
     }     
   } 

标签: google-apps-scriptgoogle-sheets

解决方案


我相信你的目标如下。

  • 您想使用工作表“Form Responses 1”的“B”列。
  • 当电子表格的工作表名称中不存在列“B”的值时,您希望插入具有该值名称的新工作表。
  • 当电子表格的工作表名称中存在“B”列的值时,您希望将该值附加到与该值相同的工作表名称。
  • 在上述过程完成后,您想删除工作表“Form Responses 1”中的所有行。

修改点:

  • 在您的脚本中,将为所有值创建新工作表。而当值为空时,就会发生错误。
  • 我认为在您的情况下,使用clearContent()和/或clear()代替如何deleteRow
    • 关于这一点,我想提出2种修改模式。

修改脚本1:

在此修改中,行将像您的脚本一样被删除。

function sheetCreate(){
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1");
  var [, ...getNames] = sheet1.getDataRange().getValues();  // <--- Modified
  var erg = sheet1.getDataRange();
  var evA=erg.getValues();
  
  // And, I modified below script.
  // 1. Create an object including the sheet name and sheet object.
  var sheetsObj = activeSpreadsheet.getSheets().reduce((o, e) => Object.assign(o, {[e.getSheetName()]: e}), {});
  
  // 2. Insert new sheet and copy the values to the sheet, and return the last row of the column "B".
  // <--- Modified
  var deleteRows = getNames.reduce((ar, r, i) => {
    if (r[1].toString() != "") {
      if (r[1] in sheetsObj) {
        sheetsObj[r[1]].appendRow(r);
      } else {
        var newSheet = activeSpreadsheet.insertSheet(r[1].toString());
        newSheet.appendRow(r);
        sheetsObj[r[1]] = newSheet;
      }
      ar.push(i + 2);
    }
    return ar;
  }, []).pop();
  
  // 3. Delete rows.
  sheet1.deleteRows(2, deleteRows - 1);
}

修改脚本2:

在此修改中,行被清除。在这种情况下,请按如下方式修改上述脚本。

从:
sheet1.deleteRows(2, deleteRows - 1);
到:
sheet1.getRange(2, 1, deleteRows - 1, sheet1.getLastColumn()).clearContent();  // Or clear()

参考:

添加:

根据您的要求if possible can you help me out this code with if or loop conditions,我将上面的脚本修改如下。两个脚本的脚本结果相同。

修改后的脚本:

function sheetCreate2(){
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1");
  var getNames = sheet1.getDataRange().getValues();
  getNames.shift();
  var erg = sheet1.getDataRange();
  var evA=erg.getValues();
  
  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];
    if (r[1].toString() != "") {
      if (r[1] in sheetsObj) {
        sheetsObj[r[1]].appendRow(r);
      } else {
        var newSheet = activeSpreadsheet.insertSheet(r[1].toString());
        newSheet.appendRow(r);
        sheetsObj[r[1]] = newSheet;
      }
      deleteRows = i + 2;
    }    
  }
  
  sheet1.deleteRows(2, deleteRows - 1);
}

推荐阅读