我的Google文档应在打开Google表格文件时提示登录对话框,并根据密码显示一个特定的标签。例如。对于“ 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表格文件在打开时应询问密码,并根据密码显示相应的表格。
答案 0 :(得分:3)
pwd2
的值时,您只想打开“ Sheet2”。如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。
修改后的脚本的流程如下。
pwd2
时,仅打开“ Sheet2”。pwd3
时,仅打开“ Sheet3”。如果要在打开电子表格时打开对话框,请将OnOpen事件触发器安装到RunOnOpen()
。
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”工作表和另一个工作表。为了避免这种情况,我更新了脚本。您能再确认一下上面的脚本吗?
如果我对您的目标的理解是正确的,那么该解决方法如何?
此替代方法的流程如下。
通过这种流程,我认为可以实现前3个目标。
用户访问Web应用程序的URL。
Google Apps脚本:Code.gsfunction 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>
来自TheMaster's somment,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);
}
答案 1 :(得分:3)
出于以下原因,我认为这是不安全的:
Sheets的hidden / visible属性是全局的,并且不限于单个用户。如果user1和user2几乎同时接连登录,则在user1登录后可以看到user1的工作表;用户2登录后,用户1的工作表将同时被用户隐藏,用户1和用户2的用户2的工作表将可见
取消隐藏工作表很容易。只要user1拥有对电子表格的编辑权限(如果要显示登录对话框,这是必需的),便可以随时取消隐藏user2的工作表。