Google表格HTML服务边栏以运行代码作为所有者

时间:2015-02-27 02:59:50

标签: google-apps-script google-sheets

所以我的目标是创建一个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函数根本没有被调用(我的理论是因为编辑是以编程方式进行的)和权限问题。

我尝试过的方法:

  1. submitEntry在工作表中添加一行,并调用方法在工作表上进行一些计算。在这种情况下,我收到有关用户无权进行编辑的错误。
  2. submitEntry在工作表中添加一行(使用appendRow方法)并使用可安装的onEdit触发器。在这种情况下,从onEdit函数进行编辑时,永远不会调用submitEntry方法,但是当同一用户手动编辑其中一个单元格时,该方法可以正常工作。我认为这样可行,因为onEdit函数应该作为所有者运行,但是在以编程方式进行编辑时它永远不会被调用。
  3. 创建一个链接到电子表格的表单。有一个获取新表单值的onFormSubmit可安装触发器,将值附加到我感兴趣的工作表中,然后运行计算。这适用于表单提交,但我希望表单来自侧边栏,因此我使用this StackOverflow页面中的方法说明从侧边栏模拟表单提交,但这似乎不能模拟表单正确提交(没有在电子表格上收到数据)。我收到错误&#34;请求失败返回代码500。&#34;当作为我自己运行时和错误消息&#34;需要授权来执行该操作&#34;以其他人身份登录时。
  4. 与3相同,但我使用Ajax从Javascript发布内容。结果是&#34; No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。&#34;错误信息。我尝试通过更改标题属性来更改请求中的origin和referer,但看起来在实际发布数据之前会覆盖这些属性。还有隐藏的输入字段,其值在表单的每次重新加载时都会波动。
  5. 我尝试了很多其他方法,但找到了他们为什么不通过文档工作的原因。

    无论我尝试哪种方法,都没有为匿名用户运行任何代码,这也是一个问题。

    有没有人对如何让这个工作有任何想法?我觉得这是一个简单的问题,但似乎无法弄明白。

    我尝试上述方法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();
    }
    

2 个答案:

答案 0 :(得分:0)

这不起作用,用户只能执行文档访问所指示的内容。 边栏以相同的权限运行:没有写访问权限的用户无法通过侧边栏脚本发布到文档。

您需要使用Google表单整理数据并将其发布到用户永远不会看到的文档中。

答案 1 :(得分:0)

请参阅Google sheets, running a function as owner

如果脚本installed trigger,则只能将脚本作为所有者运行。您只能使用几个触发事件:onOpenonEditonInstalldoGetdoPost。其中,只有onEdit才有效。因此,您无法从菜单,对话框或侧边栏运行界面。只有在界面是电子表格的一部分时才能运行界面。

  1. 首先,将所有用户界面直接放在电子表格上,并设置一个提交单元格,其下拉菜单为{“submit”}(通过验证规则)
  2. 创建一个函数,比如说apply(),它检查“提交单元格”是否为活动单元格。如果是,请将所有字段值应用于电子表格,然后清除所有输入字段。
  3. 在项目脚本编辑器中,转到资源&gt; 当前项目的触发器
  4. 创建以下规则:在电子表格中运行 apply 编辑
  5. 由于apply()installed trigger,因此它将以所有者权限运行。