Javascript 如何在Google工作表中使用Google Apps脚本从一个范围创建多个选项卡?

Javascript 如何在Google工作表中使用Google Apps脚本从一个范围创建多个选项卡?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我需要创建一个自定义函数,以便根据a列中的值在Google工作表中创建多个选项卡。我如何做到这一点 这是为了跟踪特定电子商务产品的数据。它们的名称位于第一个选项卡的第一列中。列A中的每个条目都需要有一个标签,标签上的名称相同 我不知道怎么做 输出应该是由A列中的每个单元格创建的新选项卡。在脚本编辑器中复制并粘贴此代码 function createSheet(sheetIndex, value){ // Check if cell is empty after editing if (v

我需要创建一个自定义函数,以便根据a列中的值在Google工作表中创建多个选项卡。我如何做到这一点

这是为了跟踪特定电子商务产品的数据。它们的名称位于第一个选项卡的第一列中。列A中的每个条目都需要有一个标签,标签上的名称相同

我不知道怎么做


输出应该是由A列中的每个单元格创建的新选项卡。

在脚本编辑器中复制并粘贴此代码

function createSheet(sheetIndex, value){
  // Check if cell is empty after editing
  if (value.oldValue){
    value = 'Sheet' + (sheets.length - sheetIndex);
  }

  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // If sheet already exits just change the sheet name
  if (sheets[sheetIndex]) {
    sheets[sheets.length - sheetIndex].setName(value)
  } else {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(value);
  }
}

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  // Check if the sheet being edited is the first sheet and first column (A)
  if (sheet.getSheetId() == sheets[0].getSheetId() && sheet.getActiveCell().getColumn() == 1) {
    createSheet(e.range.getRowIndex(), e.value)
  }

}

可以对代码进行扩展,支持删除;不过这有点棘手,因为没有onDelete事件。您可以将图纸数组与列中的值进行比较,以确定删除哪张图纸。

使用模板和位置创建多张图纸

  • 打开一个新的电子表格并转到脚本编辑器
  • 加载代码并保存它
  • 创建名为“图纸数据”的图纸
  • 创建三个模板
  • 运行createTrigger()
  • 关闭电子表格
  • 打开电子表格给它一些时间,它将创建所有的工作表,而不会影响模板或工作表数据表。 守则:
  • 函数onOpen(){ SpreadsheetApp.getUi().createMenu(“我的菜单”) .addItem('创建onOpen触发器','创建触发器') .addToUi(); } //这是创建图纸的地方 函数启动(){ var ss=SpreadsheetApp.getActive(); var templateA=[“A”、“B”、“C”]; templateA.forEach(函数(名称){ss.getSheetByName(名称).hideSheet();}); var sh=ss.getSheetByName(“工作表数据”); var shts=ss.getSheets(); var shtnames=shts.map(函数(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(函数(e){return e}); var hdnshts=shts.map(函数(sh){if(sh.isSheetHidden()){return sh.getName();}}).filter(函数(e){return e}); var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()); var vA=rg.getValues(); sort(函数(a,b){返回a[2]-b[2];}); vA.forEach(函数(r){ if(shtnames.indexOf(r[0])=-1&&r[0]!=sh.getName(){ ss.insertSheet(r[0],r[2],{template:ss.getSheetByName(r[1])}; } shts=ss.getSheets(); shtnames=shts.map(函数(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(函数(e){return e}); }); var end=“已接近”; } 函数isTrigger(funcName){ var r=假; 如果(名称){ var allTriggers=ScriptApp.getProjectTriggers(); 对于(var i=0;i

    三个模板: 我只是将这些模板制作成简单的示例,以帮助您创建工作表。我发现非程序员在制作非常精美的电子表格的过程中非常出色。对我来说,我让它们保持简单

    我尝试使用此gif显示第一次打开电子表格时如何创建文件。它不会创建同名的其他工作表。但如果添加其他名称,它将创建这些工作表。它无法删除已删除的工作表名称,因此您可以自己做些事情


    只有当原始工作表中a列的单元格不存在时,以下函数才会在每次编辑该单元格时创建一个新工作表。为此,请使用和触发器以及相应的:

    • 请参阅共享脚本中的注释,以逐步了解代码的作用
    • 在本例中,原始工作表称为“Sheet1”。如果不是您的情况,请相应地更改它

    我希望这会有所帮助。

    获取列a的数组,然后从数组中迭代项,检查现有选项卡,并将项作为其名称,如果不存在,则创建新选项卡,当然将项作为其名称。非常感谢-这是非常有用的!
        function onOpen() {
          SpreadsheetApp.getUi().createMenu("My Menu")
          .addItem('Create onOpen Trigger', 'createTrigger')
          .addToUi();
        }
        //This is where the sheets get created  
        function startUp() {
          var ss=SpreadsheetApp.getActive();
          var templateA=["A","B","C"];
          templateA.forEach(function(name){ss.getSheetByName(name).hideSheet();});
          var sh=ss.getSheetByName("Sheet Data");
          var shts=ss.getSheets();
          var shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
          var hdnshts=shts.map(function(sh){if(sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
          var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
          var vA=rg.getValues();
          vA.sort(function(a,b){return a[2]-b[2];});
          vA.forEach(function(r){
            if(shtnames.indexOf(r[0])==-1 && r[0]!=sh.getName()) {
              ss.insertSheet(r[0], r[2], {template:ss.getSheetByName(r[1])});
            }
            shts=ss.getSheets();
            shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
          });
          var end="is near";
        }
    
        function isTrigger(funcName){
          var r=false;
          if(funcName){
            var allTriggers=ScriptApp.getProjectTriggers();
            for(var i=0;i<allTriggers.length;i++){
              if(funcName==allTriggers[i].getHandlerFunction()){
                r=true;
                break;
              }
            }
          }
          return r;
        }
    
        //Installable onOpen trigger
        //run this function first
        function createTrigger() {
          var ss=SpreadsheetApp.getActive();
          if(!isTrigger('startUp')) {//This keeps you from creating unnecessary triggers
            ScriptApp.newTrigger('startUp').forSpreadsheet(ss).onOpen().create()
          }
        }
    
        //This is useful for testing
        function deleteSheets() {
          var ss=SpreadsheetApp.getActive();
          var sh=ss.getSheetByName("Sheet Data");
          var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
          var vA=rg.getValues();
          vA.forEach(function(r){
            ss.deleteSheet(ss.getSheetByName(r[0]));
          });
        }
    
    function onEdit(e) {
      var firstSheetName = "Sheet1"; // Name of your original sheet, change accordingly
      var range = e.range; // Edited cell
      var ss = e.source; // Edited spreadsheet
      var sheetName = range.getSheet().getName(); // Name of edited sheet
      var value = range.getValue(); // Value of the edited cell
      // Checks whether edited sheet is the original one, and edited column is A:
      if(sheetName == firstSheetName && range.getColumn() == 1) {
        // Checks whether a sheet with this name exists:
        var sheetExists = ss.getSheets().some(function(sheet) {
          return sheet.getName() == value;
        });
        // Create new sheet only if a sheet with this name it doesn't exist:
        if(!sheetExists) { 
          ss.insertSheet(value);
          range.activate(); // Go back to original edited cell
        }
      }
    }