【问题标题】:Share App Script Web App Between Multiple Google Sheets在多个 Google 表格之间共享 App Script Web App
【发布时间】:2019-12-21 09:01:41
【问题描述】:

我使用链接到 Google 表格的应用脚本编写了一个网络应用。我想将此脚本分发给多个用户,但我希望每个用户都有一个工作表的实例版本。

该脚本使用 OAuth 向第三方 API 验证用户并根据该用户的权限级别返回数据,因此工作表需要对用户唯一,但使用相同的脚本。

有没有办法做到这一点?

【问题讨论】:

  • 我编辑了我的答案以包含从长远来看可能对您更有帮助的内容

标签: google-apps-script google-sheets


【解决方案1】:

如果您访问Google Apps Script Dashboard,您可以创建一个独立的脚本。将代码粘贴到那里后,如果您转到File > Manage Versions,您将看到输入描述的提示和一个显示Save new version 的按钮。输入您想要的描述后,继续点击按钮。

现在您需要复制脚本 url 的这一部分(即您的脚本 ID) 在所需的电子表格中,在脚本编辑器中,选择 Resources > Libraries 并将您的链接输入此框中

添加后,选择你的版本(我没有输入这个的描述,但是如果你在制作项目版本时输入了描述,它会出现在版本号旁边)。

点击保存,现在您可以像这样访问您创建的库中的函数

如果您在输入这样的句点后提出建议,您就会知道它工作正常

编辑

我刚刚意识到您提到它是一个网络应用程序,在这种情况下,您可以通过不同的方式来执行此操作 - 您仍然希望它作为独立脚本,但您可以做的是根据访问 Web 应用程序的用户。我个人没有使用 OAuth 的经验,但是我已经根据之前的下拉菜单将单个网络应用程序连接到不同的工作表。

我是如何做到的:

我首先在 html 中设置下拉列表的值以包含我想要发送到的工作表 ID(更改了一些内容,因为这是来自公司代码)

<option value="1THvC8JhF-LxZOYBGRaIvpZpYoNtyfOuteWNPndtrCQo@[Title of the page]">[Option to select]</option>

然后在 Javascript 中,我将 url 设置为在重定向到下一页时包含标题和 ID

function boxVal(url){
  var ID = document.getElementById('[ID of select]').value;
  var strArr = ID.split('@');
  ID = strArr[0];
  var title = strArr[1];
  if(ID === "Select Your Department"){
    url += "?page=Department Select&title=" + title;
  }
  else{
    url += "?page=Main Page&title=" + title + "&id=" + ID;
  }
  document.getElementById('link').href = url;
  document.getElementById('link').click();
}

(如果您还不知道我如何拥有多个页面,请参阅this post)

然后在 doGet() 函数中,我抓取了传递给 URL 的 id 参数,然后我可以将其传递给 javascript 中的函数

var qString = e.parameter['id'];
uProps('SPREADSHEET_ID', qString);

uProps 在哪里

function uProps(prop, propVal){
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty(prop ,propVal);
}

这会创建一个可以在页面更改后引用的用户属性。

然后回到连接到html文件的javascript我用这个将用户属性传递给其他函数

function passFunction(receiver){
  switch(receiver) {
    case 1: google.script.run.withSuccessHandler(add).getProps('SPREADSHEET_ID'); break;
    case 2: google.script.run.withSuccessHandler(getTopInterrupt).getProps('SPREADSHEET_ID'); break;
  }
}

passFunction 从 html 中的 onclick 执行

这是 Code.gs 文件中的 .getProps 函数(我拥有的包含 doGet() 的函数)

function getProps(prop){
  return PropertiesService.getUserProperties().getProperty(prop);
}

我认为,如果您可以让它与您的 OAuth 系统一起使用,那么这将是最好的选择,因为您可以拥有一个为所有用户提供服务的 Web 应用程序版本,而无需在其他工作表。

希望对你有帮助

【讨论】:

  • 这里有很多信息,所以我仍在深入研究它,但基本上我使用原始 AppScript 作为我的 oauth 流的代理服务器,我可以使用它来分发访问权限/refresh 使用它们的工作表 ID 将令牌返回到各个工作表?感谢您的详尽回答!
  • @GeorgeWright 为迟到的回复道歉 - 我以前没有这样想过,但也许这是对正在发生的事情的一个很好的解释,因为页面最终都与文件通信 @ 987654347@ 在其中,它反过来与存储用户属性的任何地方进行通信(老实说,我并不知道)。没问题,总是很高兴提供我有经验的信息。
  • 太棒了...谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2019-08-13
  • 2018-11-23
  • 2012-06-02
  • 2017-11-24
相关资源
最近更新 更多