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

use*_*634 0 google-sheets google-apps-script

我的谷歌文档在打开谷歌表格文件时应该提示一个登录框,并且根据密码,它应该显示一个特定的选项卡。例如,对于“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
Run Code Online (Sandbox Code Playgroud)

Google 表格文件在打开时应要求输入密码,并且应根据密码显示相应的工作表。

Tan*_*ike 5

  • 您只想通过对话框中输入的值打开电子表格中所有工作表中的一张。
  • 例如,当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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

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

参考:

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

更新:

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

编辑:

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

如果我对您目标的理解是正确的,那么这个解决方法怎么样?

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

此解决方法的流程如下。

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

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

示例脚本:

  1. 在使用此脚本之前,请将电子表格拆分为每个工作表,并检索电子表格的每个 URL。
  2. 当您使用它时,请部署具有以下条件的Web Apps。如果您想了解如何部署 Web Apps,请查看
    • 将应用程序执行为:Me
    • 谁有权访问该应用程序:任何人
    • 在这种情况下,用户需要登录Google才能访问Web Apps。

用户访问Web Apps的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;
}
Run Code Online (Sandbox Code Playgroud) 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>
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 当您修改脚本时,请将项目部署为新版本。这样,最新的脚本就会反映到Web Apps中。请小心这一点。
  • 我认为当每个电子表格只为每个用户共享时,安全性会很高。
  • Web Apps 的最大同时访问数为 30。参考
  • 这是一个简单的示例脚本。所以如果你使用这个,请根据你的情况进行修改。
  • TheMaster的评论来看Although 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);
      }
      
      Run Code Online (Sandbox Code Playgroud)

参考: