所以我的目标是创建一个HTML服务边栏,用户可以使用该边栏在受保护的工作表上创建只有所有者才有权编辑的条目。我似乎无法找到一种方法来做到这一点,并且我将涵盖我在下面尝试的所有事情。
以下是任何解决方案中的代码:
Sidebar.html
<link rel="stylesheet" href="//ssl.gstatic.com/docs/script/css/add-ons.css">
<div class="sidebar branding-below">
<form id="submission">
<div class="block">
<div class="inline form-group">
<label for="date">Date</label>
<input id="date" name="date" type="text" value="" />
</div>
</div>
<div class="block">
<div class="inline form-group">
<label for="name">Name</label>
<input id="name" name="name" type="text" value="" />
</div>
<div class="inline form-group">
<label for="number">Number</label>
<input id="number" name="number" type="text" value="" />
</div>
</div>
<div class="block">
<button id="submit" type="submit" class="action">Submit</button>
</div>
</form>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
补充工具栏Javascript.html
<script>
$(document).ready(function() {
$("#submit").click(function(e) {
google.script.run
.submitEntry(document.forms[0]);
// prevents app from trying to serve new page after submission
e.preventDefault();
});
</script>
无法更改的服务器端代码:
function showSidebar() {
var ui = HtmlService.createTemplateFromFile("Sidebar")
.evaluate()
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setTitle("Data Entry");
}
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.getContent();
}
服务器端代码的其余部分是我尝试了很多不同的东西来实现这一点的。主要问题是onEdit函数根本没有被调用(我的理论是因为编辑是以编程方式进行的)和权限问题。
我尝试过的方法:
submitEntry
在工作表中添加一行,并调用方法在工作表上进行一些计算。在这种情况下,我收到有关用户无权进行编辑的错误。submitEntry
在工作表中添加一行(使用appendRow
方法)并使用可安装的onEdit
触发器。在这种情况下,从onEdit
函数进行编辑时,永远不会调用submitEntry
方法,但是当同一用户手动编辑其中一个单元格时,该方法可以正常工作。我认为这样可行,因为onEdit
函数应该作为所有者运行,但是在以编程方式进行编辑时它永远不会被调用。我尝试了很多其他方法,但找到了他们为什么不通过文档工作的原因。
无论我尝试哪种方法,都没有为匿名用户运行任何代码,这也是一个问题。
有没有人对如何让这个工作有任何想法?我觉得这是一个简单的问题,但似乎无法弄明白。
我尝试上述方法2的示例:
// should run as user who submitted form on sidebar
function submitEntry(form) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
sheet.appendRow([form.date, form.name, form.number]);
}
// should run as user who installed script
// never gets called????
function onEditInstallable(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var data = sheet.getDataRange().getValues();
sheet.clear();
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
sheet.appendRow([data[0][0], data[0][1], data[0][2]]);
doCalculationStuff();
}
答案 0 :(得分:0)
这不起作用,用户只能执行文档访问所指示的内容。 边栏以相同的权限运行:没有写访问权限的用户无法通过侧边栏脚本发布到文档。
您需要使用Google表单整理数据并将其发布到用户永远不会看到的文档中。
答案 1 :(得分:0)
请参阅Google sheets, running a function as owner
如果脚本installed trigger,则只能将脚本作为所有者运行。您只能使用几个触发事件:onOpen
,onEdit
,onInstall
,doGet
和doPost
。其中,只有onEdit
才有效。因此,您无法从菜单,对话框或侧边栏运行界面。只有在界面是电子表格的一部分时才能运行界面。
apply()
,它检查“提交单元格”是否为活动单元格。如果是,请将所有字段值应用于电子表格,然后清除所有输入字段。apply()
是installed trigger,因此它将以所有者权限运行。