隐藏/显示共享文件上特定用户的特定表格选项卡

时间:2019-06-12 04:50:40

标签: google-apps-script google-sheets

我的Google文档应在打开Goog​​le表格文件时提示登录对话框,并根据密码显示一个特定的标签。例如。对于“ password1”,应该只允许用户看到选项卡“ Sheet1”,而其他工作表则应隐藏。同样,对于“ password2”,它应该只允许用户看到和使用选项卡“ Sheet2”。

我尝试运行以下代码,但是显示了一些错误。

function showLoginDialog() {
    var sheet3 = SpreadsheetApp.getActiveSheet('Sheet3');
    sheet3.hideSheet();
    var sheet2 = SpreadsheetApp.getActiveSheet('Sheet2');
    sheet2.hideSheet();
    var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet('Sheet1');      
    var ui = SpreadsheetApp.getUi();      
    var prompt = ui.prompt('Password','Enter Password',ui.ButtonSet.OK_CANCEL);      
    var response = prompt.getResponseText();      
    var button = prompt.getSelectedButton();  

    if(button==ui.Button.OK) {       
    if(response=='pwd3') {
            sheet3.activate();
        }//end of inner if
        if(response=='pwd2'){
            sheet2.activate();
        }
    }//end of main if
}//end of function

Google表格文件在打开时应询问密码,并根据密码显示相应的表格。

2 个答案:

答案 0 :(得分:3)

  • 您只想通过对话框中输入的值打开电子表格中的所有工作表之一。
  • 例如,当输入pwd2的值时,您只想打开“ Sheet2”。
  • 要在打开电子表格时打开对话框。

如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。

修改后的脚本的流程如下。

  1. 打开电子表格时,默认情况下仅打开“ Sheet1”。
  2. 打开一个对话框。
  3. 输入pwd2时,仅打开“ Sheet2”。
  4. 输入pwd3时,仅打开“ Sheet3”。

如果要在打开电子表格时打开对话框,请将OnOpen事件触发器安装到RunOnOpen()

如何安装OnOpen触发器:

  • 打开脚本编辑器。
    • 编辑->当前项目的触发器。
    • 点击“添加触发器”。
    • RunOnOpen设置为“选择要运行的功能”。
    • 将“来自电子表格”设置为“选择事件源”。
    • 将“选择事件类型”设置为“打开时”。

修改后的脚本:

function RunOnOpen() {
  // Updated
  var openSheet = function(ss, sheets, sheet) {
    var s = ss.getSheetByName(sheet);
    s.showSheet();
    ss.setActiveSheet(s);
    for (var i = 0; i < sheets.length; i++) {
      if (sheets[i].getSheetName() != sheet) {
        sheets[i].hideSheet();
      }
    }
  };

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  openSheet(ss, sheets, "Sheet1"); // Open only "Sheet1" when this function is run.
  var ui = SpreadsheetApp.getUi();
  var prompt = ui.prompt('Password','Enter Password',ui.ButtonSet.OK_CANCEL);
  var response = prompt.getResponseText();
  var button = prompt.getSelectedButton();

  if (button == ui.Button.OK) {
    var sheet = "";
    if(response == 'pwd3') {
      openSheet(ss, sheets, "Sheet3");
    } else if(response == 'pwd2') {
      openSheet(ss, sheets, "Sheet2");
    }
  }
}

注意:

  • 在此修改后的脚本中,当在脚本编辑器中手动运行RunOnOpen()时,脚本将起作用。为此,我没有使用OnOpen事件触发器的事件对象。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

已更新:

当我对该脚本进行多次测试时,有时会打开“ Sheet1”工作表和另一个工作表。为了避免这种情况,我更新了脚本。您能再确认一下上面的脚本吗?

编辑:

  • 您想通过输入每个密码来使用户使用电子表格的特定表。
  • 您不想为用户发布脚本。
  • 您想让多个用户同时使用电子表格。

如果我对您的目标的理解是正确的,那么该解决方法如何?

  • 为每个用户创建每个电子表格。
    • 这样,可以同时访问电子表格。
  • 使用Web应用程序以通过输入密码来打开每个电子表格。

此替代方法的流程如下。

  1. 登录Google的用户打开Web Apps。
  2. 用户输入密码,然后单击“确定”。
  3. 在服务器端检查密码,并返回与该密码相对应的电子表格的网址。
  4. 从URL打开电子表格。

通过这种流程,我认为可以实现前3个目标。

示例脚本:

  1. 在使用此脚本之前,请为每个工作表拆分电子表格,并检索电子表格的每个URL。
  2. 使用此功能时,请在满足以下条件的情况下部署Web Apps。如果您想知道如何部署Web Apps,请检查this
    • 以以下身份执行该应用:
    • 有权访问该应用的人:任何人
    • 在这种情况下,要求用户登录Google才能访问Web Apps。

用户访问Web应用程序的URL。

Google Apps脚本:Code.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}

function selectSpreadsheet(value) {
  var url = "";
  if (value == "pwd2") {
    url = "### URL of Spreadsheet for password of pwd2 ###";
  } else if (value == "pwd3") {
    url = "### URL of Spreadsheet for password of pwd3 ###";
  }
  return url;
}
HTML和Javascript:index.html
<input type="text" id="value" >
<input type="button" value="ok" onclick="openSpreadsheet()">

<script>
function openSpreadsheet() {
  var value = document.getElementById("value").value;
  google.script.run.withSuccessHandler((url) => {
    if (url) window.open(url,'_top');
  }).selectSpreadsheet(value);
}
</script>

注意:

  • 修改脚本后,请将该项目部署为新版本。这样,最新脚本将反映到Web Apps。请注意这一点。
  • 我认为,只有每个用户共享每个电子表格时,安全性才会很高。
  • Web应用程序的最大同时访问数为30。Ref
  • 这是一个简单的示例脚本。因此,如果您使用此功能,请根据具体情况对其进行修改。
  • 来自TheMaster's sommentAlthough it's highly unlikely that users are able to retrieve the passwords from source code, I recommend using private functions and/or properties service for storing of passwords for a extra layer of security.

    • 作为示例,您可以通过将密码和URL保存到PropertiesService来像下面一样使用。

      function selectSpreadsheet(value) {
        return PropertiesService.getUserProperties().getProperty(value);
      }
      

参考文献:

答案 1 :(得分:3)

出于以下原因,我认为这是不安全的:

  • Sheets的hidden / visible属性是全局的,并且不限于单个用户。如果user1和user2几乎同时接连登录,则在user1登录后可以看到user1的工作表;用户2登录后,用户1的工作表将同时被用户隐藏,用户1和用户2的用户2的工作表将可见

  • 取消隐藏工作表很容易。只要user1拥有对电子表格的编辑权限(如果要显示登录对话框,这是必需的),便可以随时取消隐藏user2的工作表。