【问题标题】:Show Specific Tabs based on drop-down selection in Google Sheets根据 Google 表格中的下拉选择显示特定标签
【发布时间】:2021-05-05 10:02:05
【问题描述】:

我是一个脚本新手,希望通过以下 Google 表格练习获得一些帮助。

我目前在此 Google 表格文档中有 2 个标签:“班级列表”和“模板”。我目前正在运行一个脚本,该脚本允许将名称添加到“类列表”中,然后根据“模板”页面布局为每个名称生成一个选项卡。

我想知道是否可以隐藏所有选项卡并创建一个“欢迎/主页”选项卡,其中包含所有名称的下拉列表。从下拉列表中进行选择后,它将向用户显示同名的工作表(同时隐藏所有其他工作表)。

此脚本的目的是一次只显示一个选定的工作表(下拉列表将排除 2x 原始“类列表”和“模板”选项卡。名称列表及其对应选项卡将不断变化和更新。

这可能吗?谢谢

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这是一个示例工作代码,您应该可以阅读。

    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var classListSheet = spreadsheet.getSheetByName("Class List");
    
    function createMainSheet(){
      // Create mainsheet if it isn't existing
      if(!spreadsheet.getSheetByName("Welcome/Home Page")){
        spreadsheet.insertSheet("Welcome/Home Page"); 
      }
      
      var mainSheet = spreadsheet.getSheetByName("Welcome/Home Page");
    
      // Hide all other sheets AFTER creating main as you need at least 1 shown sheet
      var sheets = spreadsheet.getSheets();
      sheets.forEach(function (sheet) {
        if(sheet.getName() != "Welcome/Home Page") {
          sheet.hideSheet();
        }
      });
    
      // Range where names are
      var dynamicList = classListSheet.getRange("A:A");
      var rangeRule = SpreadsheetApp.newDataValidation().requireValueInRange(dynamicList).build();
      // Create dropdown in mainSheet on A1
      // Drop down updates when you add name on dynamicList range (column A in Class List)
      mainSheet.getRange("A1").setDataValidation(rangeRule);
    }
    
    function onEdit(e) {
      // If editing mainSheet
      if(spreadsheet.getActiveSheet().getSheetName() == "Welcome/Home Page"){
        var mainSheet = spreadsheet.getSheetByName("Welcome/Home Page");
        // Get value of dropdown
        var name = mainSheet.getRange("A1").getValue();
        // Hide old chosen sheet if existing 
        // Drop down default value when created is blank
        // It will fail the first time you change if this isn't added
        if(spreadsheet.getSheetByName(e.oldValue)) {
          spreadsheet.getSheetByName(e.oldValue).hideSheet();
        }
        // Show new chosen sheet
        spreadsheet.getSheetByName(name).showSheet();
        spreadsheet.setActiveSheet(spreadsheet.getSheetByName(name));
      }
    }
    
    function addName(){
      // Creating dummy function for adding names and tabs on Class List sheet
      var name = "Name" + (classListSheet.getLastRow() + 1);
      // Append "Name<rowNumber>" on column A in Class List sheet
      classListSheet.appendRow([name]);
    
      // Insert newly added sheet then hide
      spreadsheet.insertSheet(name);
      spreadsheet.getSheetByName(name).hideSheet();
    }
    

    您可能需要修改上面的一些细节,例如名称所在的范围和下拉菜单的位置,但这应该相对容易。

    班级列表:

    主表:

    【讨论】:

    • 谢谢你 - 这完美!我只是想知道是否有一段代码可以添加,一旦从主页下拉列表中选择它,我就可以将其带到工作表中?我想我需要一些类似于 setActiveSheet(name) 的东西?是否也可以在创建主页后隐藏除主页之外的所有选项卡?再次感谢您!
    • 嗨@BLibrary,我已经根据你的cmets更新了答案。对于setActiveSheet,您需要传递工作表而不是名称才能使其工作。另外,我在主工作表创建后重新设计了选项卡的隐藏,而不是仅仅隐藏 TemplateClass List,因为有一种情况是您已经创建了其他选项卡,您只需再次运行 createMainSheet 以隐藏所有除了主表之外的其他选项卡。如果您的问题得到解决,请按接受按钮。与您有相同问题的其他人也可以将您的问题作为可以解决的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多