Google Apps脚本添加在google.run.script上以开发人员身份运行吗?

时间:2018-09-15 15:47:25

标签: google-apps-script google-apps-script-addon

我在GAS工作仅不到6个月。到目前为止,所有内容都已绑定到电子表格项目中,但创建了许多项目。我迫切需要创建一个附加的侧边栏,人们可以在他们想要的任何电子表格中使用(在域中)。我创建了代码,并将其发布,以便只有域才能看到它,并可以将其安装为同一域中的另一个用户,所有这些似乎都可以正常工作。

问题与sidebar.html有关,并在脚本中使用google.script.run调用了一个函数,以调用获取一些外部数据并将其写入当前工作表的函数。所有用于获取外部数据的代码都可以正常工作,它们全部进入二维数组。折断的部分位于SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,1,x,y).setValues(array)。我收到“您没有访问所请求文档的权限”

我在测试过程中做了以下事情:

1)加载项的脚本开始时是与要开发的现有工作表的绑定脚本。考虑到可能是问题所在,我重新创建了一个独立的GAS项目,并将其作为表格的Web附件发布。没什么。

2)开发人员可以很好地运行附加组件,而不会出现侧边栏错误。

3)我为附加组件创建了另一个菜单项,而不是打开侧栏并让侧栏通过google.script.run调用该函数,而是直接从菜单运行该函数。这样,它就可以为其他域用户“工作”(无法从侧边栏运行它)。

4)我与开发人员与域测试用户“共享”了我用来测试附加组件的基础Google表格,然后侧边栏脚本将起作用。如果我在另一个非共享工作表中使用附加组件,则会出现权限错误。

5)如果我在我们都使用并可以访问(整个域)的大共享Drive文件夹中的工作表上使用它,则它可以正常工作,就像我在上面的“ 3”测试中所期望的那样。 / p>

  

大问题:

     

因此,好像“ google.script.run”作为开发人员运行,并且   不是作为当前用户(在键盘上)?那正确吗?往里看   this之类的文档,我找不到任何表明   那。我应该添加一些东西来确保它起作用吗?   这是我发布方式的副作用,仅适用于域使用吗?

更新:我没有特别确定一个人,而是测试了某人的“查找并替换”加载项,并且可以肯定的是,它能够从侧边栏直接写到工作表而没有任何问题。我所做的唯一一件事就是在安装该应用程序时对其进行了授权。因此,这显然是可能的。我只是想弄清楚我的附件中可能缺少的内容,这将允许我执行相同的操作。

这里有一个很小的示例,我整理了一下,以测试当前活动工作表中A1:B2的2列2行数组的“写入”。它既可以在菜单上也可以在侧边栏中作为开发人员使用。它始终以域用户的身份在菜单中起作用,但如果开发者具有对该文件的直接权限(通过一次性共享或通过在先前共享的文件夹中创建,则开发者具有该权限),则只能从边栏中“起作用”。适当的权限。)

// scopes
https://www.googleapis.com/auth/script.container.ui
https://www.googleapis.com/auth/spreadsheets

// code.gs
function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu()
 .addItem('Sidebar Test', 'showSidebar')
 .addItem('setValues Test', 'setValuesTest')
 .addToUi();
}

function showSidebar() {
  var htmlTemplate = HtmlService.createTemplateFromFile('sidebar');
  var ui = htmlTemplate.evaluate()
    .setTitle('Sidebar Test')
  SpreadsheetApp.getUi().showSidebar(ui);
}

function onInstall(e) {
  onOpen(e);
}

function setValuesTest() {
  try {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var valArr = [];
    valArr.push([1,2]);
    valArr.push([3,4]);
    sheet.getRange(1, 1, 2, 2).setValues(valArr);
  } catch (e) {
    throw new Error(errorMessage({e: e}));
  }
}

function errorMessage(params) {
  return params.e.message + '<br/><div class="main">file: '+ 
    params.e.fileName+'<br/>line: '+ params.e.lineNumber + '</div>';
}

function getVersion() {
  var scriptProps = PropertiesService.getScriptProperties();
  return scriptProps.getProperty('Version');
}

// utility.gs
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

// sidebar.js.html
<script>
$(function() {
  $('#run-query').click(runQueryButton);
});

function runQueryButton() {
  runQuery(this);
}

function runQuery(element) {
  element = (element === 'undefined') ? this : element;
  element.disabled = true;
  $('#error').remove();
  google.script.run
    .withSuccessHandler(
      function(msg, element) {
        element.disabled = false;
      })
    .withFailureHandler(
      function(msg, element) {
        showError(msg, $('#main'));
        element.disabled = false;
      })
    .withUserObject(element)
    .setValuesTest();
  google.script.host.editor.focus();
}

function showError(msg, element) {
  var div = $('<div id="error" class="error">' + msg + '</div>');
  $(element).after(div);
}
</script>

// sidebar.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <?!= include('sidebar.css'); ?>
  </head>
  <body>
    <div class="sidebar branding-below">
      <div id="main" >
        <button class="blue cursor-pointer" id="run-query" data-toggle="modal">Execute</button>
      </div>
    </div>
    <div class="sidebar bottom">
      Version: <?!= getVersion(); ?>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <?!= include('sidebar.js'); ?>
  </body>
</html>

// sidebar.css.html
<style>
.error {
  padding: .25em .25em;
  font-family: Arial,sans-serif;
}
</style>

更新2 我将部署类型更改为“仅受信任的测试人员”,并添加了我的非域自我作为该测试人员。我将自己的链接发送到了该应用,然后从那里安装了它。回答了授权弹出窗口(尽管由于我不在域中,所以我必须走“不安全”路线,这很好)。跑了测试插件...它就像冠军!现在,我本人(非域)和其他开发人员本人(域)均支付了​​$ 5。那是问题吗?我在域中“创建”的测试用户没有支付任何费用,因此行不通吗?

对我来说,这没有多大意义,因为安装了测试附加组件,并且测试用户(在域中)可以从“菜单”调用基础脚本,并且可以很好地填充电子表格。仅当域用户尝试从侧栏运行应用程序时,它才会崩溃,侧栏通过google.script.run调用来调用代码。这真的,真的很奇怪,令人沮丧。

另一方面,我添加了一个功能来在侧栏上显示“有效用户”,以防万一在前端发生了一些棘手的情况,并且看起来很好,并报告了测试的名称域中的用户,而不是域中开发人员的名称。

我想我的下一个测试将是:

  1. 将其翻转回域,为域测试用户重新安装,看看是否有其他事情没有解决。

  2. 如果仍然损坏,请将其翻转回受信任的测试人员,将域测试用户添加到该组中,向另一个支付5美元,并查看他们是否可以这种方式安装和运行它。如果可以的话,则可能是域的附件发布存在缺陷,或者我缺少一些文档(或未记录的文档)。

1 个答案:

答案 0 :(得分:2)

google.script.run将始终以加载项的有效用户身份运行(可能是开发人员,也可能不是开发人员)。

但是,如果未授予用户编辑电子表格的权限,则会出现错误。

您可以尝试为您的域设置团队驱动器,以便可以轻松地与团队中的用户共享文档。或者,您可以为域中的所有用户创建一个共享文件夹(具有编辑权限),以存储该域中的所有用户都应可访问的文档。