Google Sheets 脚本 visiblesheets 帮助

Google Sheets Script visiblesheets assistance

我目前遇到了一些问题,就 google sheet 而言,我(充其量)是个新手,脚本方面更是如此。

我目前有 -

    // global var
var ss = SpreadsheetApp.getActiveSpreadsheet();

function onOpen() {
  showGoToSheet();
}
function showGoToSheet() {
  var app = UiApp.createApplication().setTitle("Please Select Search Tool")
    .setHeight(400).setWidth(450);
  var sPanel = app.createScrollPanel().setAlwaysShowScrollBars(true)
    .setSize(440, 400);
  var vPanel = app.createVerticalPanel().setSize(400, 400);
  var fTable = app.createFlexTable().setCellPadding(5).setSize(400, 400)
    .setCellSpacing(0).setBorderWidth(1); 
  var allsheets = ss.getSheets();   
  var goToSheetClick = app.createServerHandler('handleGoToSheetClick');     
  for (var i=0, iLen=allsheets.length; i<iLen; i++) {
    var sheet_name = allsheets[i].getName();
    fTable.setWidget(i, 0, app.createButton(sheet_name).setId(sheet_name)
      .setWidth(200).addClickHandler(goToSheetClick)); 
  }
  app.add(sPanel.add(vPanel.add(fTable)));
  ss.show(app);
}

function handleGoToSheetClick(e) {
  var app = UiApp.getActiveApplication();  
  ss.getSheetByName(e.parameter.source).activate();
  app.close();   
  return app; 
}

你们大多数人都知道,这会在 sheet 上打开一个 "popup",问我 sheet 我想去哪里。然而,在我的 Google Sheet 上,我有几个搜索工具和更多的数据库。此 "getsallsheets" 并在其他用户无法访问的列表中显示 "hidden" and/or "protected" sheet。

我是否可以限制对所有 "visible" sheet 的访问?然后它会忽略 hidden/protected?或者即使它只会显示可见列表而忽略隐藏列表。我可以忍受隐藏我受保护的 sheets :)

不幸的是,由于我的搜索功能的性质,我无法在没有某种形式的编辑权限的情况下进行尝试。所以我的困境是我在工作之外真的没有太多的试错能力。

谢谢

我们一如既往地感谢您的帮助。

此方法未经测试,但可能有效。

        // global var
var ss = SpreadsheetApp.getActiveSpreadsheet();

function onOpen() {
  showGoToSheet();
}
function showGoToSheet() {
  var app = UiApp.createApplication().setTitle("Please Select Search Tool")
    .setHeight(400).setWidth(450);
  var sPanel = app.createScrollPanel().setAlwaysShowScrollBars(true)
    .setSize(440, 400);
  var vPanel = app.createVerticalPanel().setSize(400, 400);
  var fTable = app.createFlexTable().setCellPadding(5).setSize(400, 400)
    .setCellSpacing(0).setBorderWidth(1); 
  var allsheets = ss.getSheets();   
  var goToSheetClick = app.createServerHandler('handleGoToSheetClick');     
  for (var i=0, iLen=allsheets.length; i<iLen; i++) {

    if(allsheets[i].isSheetHidden()!= true){
    var sheet_name = allsheets[i].getName();
    fTable.setWidget(i, 0, app.createButton(sheet_name).setId(sheet_name)
      .setWidth(200).addClickHandler(goToSheetClick)); 
  }
  app.add(sPanel.add(vPanel.add(fTable)));
  ss.show(app);
  }
}

function handleGoToSheetClick(e) {
  var app = UiApp.getActiveApplication();  
  ss.getSheetByName(e.parameter.source).activate();
  app.close();   
  return app; 
}

我刚刚将这部分添加到循环中

if(allsheets[i].isSheetHidden()!= true)

我从未使用过 isSheetHidden 功能,但我认为这是需要的,可能我已将其放在正确的位置。

在此行下方编辑

我测试了我的代码,发现它仍在为不存在的按钮创建空间。因此,不要立即创建 table。我刚刚将名称推入数组并添加了另一个循环。

        // global var
var ss = SpreadsheetApp.getActiveSpreadsheet();

function onOpen() {
  showGoToSheet();
}
function showGoToSheet() {
  var app = UiApp.createApplication().setTitle("Please Select Search Tool")
    .setHeight(400).setWidth(450);
  var sPanel = app.createScrollPanel().setAlwaysShowScrollBars(true)
    .setSize(440, 400);
  var vPanel = app.createVerticalPanel().setSize(400, 400);
  var fTable = app.createFlexTable().setCellPadding(5).setSize(400, 400)
    .setCellSpacing(0).setBorderWidth(1); 
  var allsheets = ss.getSheets();   
  var goToSheetClick = app.createServerHandler('handleGoToSheetClick');     
 var visSheet = [];
  for (var i=0; i<allsheets.length; i++) {

    if(allsheets[i].isSheetHidden()!= true){
      visSheet.push(allsheets[i].getName())}
  }

    for (var x =0;x<visSheet.length;x++){
    var sheet_name = visSheet[x];
    fTable.setWidget(x, 0, app.createButton(sheet_name).setId(sheet_name)
      .setWidth(200).addClickHandler(goToSheetClick)); 
    }
  app.add(sPanel.add(vPanel.add(fTable)));
  ss.show(app);

}

function handleGoToSheetClick(e) {
  var app = UiApp.getActiveApplication();  
  ss.getSheetByName(e.parameter.source).activate();
  app.close();   
  return app; 
}

您的原始代码唯一真正的变化是这一部分。

 var visSheet = [];
  for (var i=0; i<allsheets.length; i++) {

    if(allsheets[i].isSheetHidden()!= true){
      visSheet.push(allsheets[i].getName())}
  }

    for (var x =0;x<visSheet.length;x++){
    var sheet_name = visSheet[x];
    fTable.setWidget(x, 0, app.createButton(sheet_name).setId(sheet_name)