【问题标题】:Google Sheets HTML Service Sidebar to run code as ownerGoogle Sheets HTML 服务边栏以所有者身份运行代码
【发布时间】: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 函数根本没有被调用(我的理论是因为编辑是以编程方式进行的)和权限问题。

我尝试过的方法:

  1. submitEntry 向工作表添加一行,并调用一个方法对工作表进行一些计算。在这种情况下,我收到有关用户无权进行编辑的错误消息。
  2. submitEntry 使用可安装的onEdit 触发器向工作表添加一行(使用appendRow 方法)。在这种情况下,当从submitEntry 函数进行编辑时,永远不会调用onEdit 方法,但在同一用户手动编辑其中一个单元格时工作正常。我认为这会起作用,因为 onEdit 函数应该以所有者身份运行,但在以编程方式进行编辑时它永远不会被调用。
  3. 创建一个链接到电子表格的表单。有一个 onFormSubmit 可安装触发器,它获取新的表单值,将值附加到我感兴趣的工作表,然后运行计算。这适用于表单提交,但我希望表单来自侧边栏,所以我使用 this StackOverflow 页面中的说明方法模拟了从侧边栏提交的表单,但这似乎不能正确模拟表单提交(没有电子表格上收到的数据)。我收到错误“返回代码 500 的请求失败”。以我自己身份运行时,以其他人身份登录时出现错误消息“需要授权才能执行该操作”。
  4. 与 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


【解决方案1】:

这不起作用,用户只能按照他们的文档访问权限进行操作。 侧边栏以相同的权限运行:没有写入权限的用户无法通过侧边栏脚本发布到文档。

您需要使用谷歌表单来整理数据并将其发布到用户永远无法看到的文档中。

【讨论】:

    【解决方案2】:

    Google sheets, running a function as owner

    只有installed trigger 才能以所有者身份运行脚本。您只能使用几个触发事件:onOpenonEditonInstalldoGetdoPost。其中,只有onEdit 可以工作。因此,您无法从菜单、对话框或侧边栏运行界面。只有当它是电子表格的一部分时,您才能运行该界面。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2015-01-04
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多