【问题标题】:How can multiple tabs be created from a range using Google Apps Script in a Google Sheet?如何使用 Google 表格中的 Google Apps 脚本从一个范围内创建多个选项卡?
【发布时间】:2019-11-10 01:21:27
【问题描述】:

我需要创建一个自定义函数,以便根据 A 列中的值在 Google 表格中创建多个选项卡。我该怎么做?

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

我不知道该怎么做。

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

【问题讨论】:

  • 取a列的数组,然后从数组中迭代item,检查以item为名称的现有选项卡,如果不存在,则创建新选项卡,当然以item为名称

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


【解决方案1】:

复制此代码并将其粘贴到脚本编辑器中。

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 事件。您可以将工作表数组与列中的值进行比较,以确定删除哪个工作表。

【讨论】:

    【解决方案2】:

    使用模板和位置创建多个工作表

    1. 打开一个新的电子表格并转到脚本编辑器
    2. 加载代码并保存
    3. 创建名为“Sheet Data”的工作表
    4. 创建三个模板
    5. 运行 createTrigger()
    6. 关闭电子表格
    7. 打开电子表格给它一些时间,它会创建所有工作表,而不会打扰模板或工作表数据表。 守则:
        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]));
          });
        }
    

    创作表:

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

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

    【讨论】:

    • 非常感谢 - 这非常有用!
    【解决方案3】:

    每次编辑原始工作表中 A 列中的单元格时,下面的此函数会创建一个新工作表,前提是不存在具有此名称的另一个工作表。为此,使用了onEdit 触发器以及相应的event object

    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
        }
      }
    }
    
    • 查看共享脚本中的 cmets,逐步了解代码在做什么。
    • 在此示例中,原始工作表称为“Sheet1”。如果不是您的情况,请相应地进行更改。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多