【发布时间】:2015-02-27 02:59:50
【问题描述】:
所以我的目标是创建一个 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使用可安装的onEdit触发器向工作表添加一行(使用appendRow方法)。在这种情况下,当从submitEntry函数进行编辑时,永远不会调用onEdit方法,但在同一用户手动编辑其中一个单元格时工作正常。我认为这会起作用,因为onEdit函数应该以所有者身份运行,但在以编程方式进行编辑时它永远不会被调用。 - 创建一个链接到电子表格的表单。有一个 onFormSubmit 可安装触发器,它获取新的表单值,将值附加到我感兴趣的工作表,然后运行计算。这适用于表单提交,但我希望表单来自侧边栏,所以我使用 this StackOverflow 页面中的说明方法模拟了从侧边栏提交的表单,但这似乎不能正确模拟表单提交(没有电子表格上收到的数据)。我收到错误“返回代码 500 的请求失败”。以我自己身份运行时,以其他人身份登录时出现错误消息“需要授权才能执行该操作”。
- 与 3 相同,只是我使用 Ajax 从 Javascript 发布内容。结果是“请求的资源上不存在‘Access-Control-Allow-Origin’标头”。错误信息。我尝试通过更改标头属性来更改请求中的来源和引用者,但看起来它们在实际发布数据之前已被覆盖。还有隐藏的输入字段,其值会在每次重新加载表单时波动。
我尝试了许多其他方法,但找到了无法通过文档工作的原因。
无论我尝试哪种方法,都没有为匿名用户运行任何代码,这也是一个问题。
有没有人对我如何让它发挥作用有任何想法?我觉得这是一个简单的问题,但似乎无法弄清楚。
我在上述方法 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();
}
【问题讨论】:
-
我认为您将无法使用
getActiveSpreadsheet()方法。无权编辑电子表格的人正在查看活动电子表格。您是否尝试过按 ID 获取电子表格?你发表过剧本吗? -
他们有权编辑电子表格,但每个单独的工作表都受到保护,他们无法编辑除
Sheet1之外的任何工作表。getActiveSpreadsheet()方法适用于submitEntry函数,只要我将行附加到他们确实有权编辑的工作表。
标签: google-apps-script google-sheets