【问题标题】:What would be the best way to create multiple Google Apps Scripts for an organization?为组织创建多个 Google Apps 脚本的最佳方式是什么?
【发布时间】:2022-01-06 18:39:37
【问题描述】:

我将多个 Google Apps 脚本部署为库并添加到 Google 表格中。

当我与其他用户共享这些工作表时,问题就开始了。 为了让他们看到用户菜单加载,我需要让他们编辑访问我的库脚本。仅查看访问权限是不够的。然后我从他们那里收到以下错误消息“异常:尚未为您的 Apps 脚本管理的云平台项目启用 Service Admin SDK API”

而且我知道我正在使用函数 AdminDirectory.Members.insert(...); 我不想在 GSuite 中为他们添加 API 权限。

以下 oauthScopes 正在使用中:

“oauthScopes”:[
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/documents",
"https://www.googleapis.com/auth/script.send_mail",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email",
“https://www.googleapis.com/auth/admin.directory.group.member”
]

我正在寻找一种解决方案来创建这些脚本,以便我能够将它们添加到我的 Google 表格中,其中用户菜单可以从脚本加载并由用户调用。库/附加组件中的所有脚本代码(例如:GSuite 创建新用户/将用户添加到组/打开、编辑文档/打开、编辑工作表)都应该通过我的凭证运行,而不是通过他们的凭证运行。用户不应该能够查看/编辑库/附加脚本的代码。

他们应该能够看到和编辑的唯一代码是工作表脚本文件中的小 onOpen 脚本。他们必须有权访问脚本库/附加组件,但只能运行它,从中调用函数。他们不应该能够阅读和编辑库/附加脚本代码。他们在电子表格中的代码非常小。只是一个 onOpen 触发器,它将从脚本加载菜单并访问可以从菜单调用的主要功能。这些将是公共职能。其余的都是私人的。

Sheet 中的脚本


名为“脚本”的库


这就是我的脚本在表格中加载菜单并通过它调用函数的方式。

【问题讨论】:

  • 如果我理解正确,您希望用户执行他们无权访问的脚本吗?这是不可能的。如果您install onOpen 触发器,您可以显示菜单而不授予他们访问库的权限,但如果他们无权访问功能代码,则不能让他们从菜单执行功能。
  • 如果您希望他们执行调用 Admin SDK 的功能,您可以使用模拟您的服务帐户,但无论如何他们都需要访问这些功能。但是,如果您提供有关您的情况和目标的更多背景信息,也许可以找到解决方法。
  • 对不起,如果我不能清楚地解释我的计划。当然,他们必须有权访问脚本库/附加组件,但只能运行。他们不应该能够阅读和编辑库/附加脚本代码,如果你愿意的话,就像一个应用程序一样。您可以运行应用程序,但看不到源代码。他们在电子表格中的代码非常小。只是一个 onOpen 触发器,它将从附加的库/附加组件中加载菜单并访问可以从菜单中调用的主要功能。这些将是公共职能。其余的可能是私有的。
  • 邮件的目标不是让脚本在其凭据下运行,而是让库的创建者/用户运行。此外,脚本必须在实际工作表中做一些工作,并且还必须访问驱动器上的其他工作表和文档。因为我是管理员,所以我可以访问所有内容。如果新用户想使用此表格,那么我需要给他们一些 API 访问权限,对其他表格和文档的写入权限。我不确定我是否可以使用库来做到这一点。有谁知道 Sheet 的 Editor 插件可以做到这一点?

标签: google-apps-script google-sheets


【解决方案1】:

问题:

如果我正确理解您的情况:

  • 您有一个编辑器插件,您希望通过它执行访问 Admin SDK 的功能(通过 custom menu)。
  • 您希望域中没有权限访问 Admin SDK 的用户能够执行这些功能。
  • 您是域管理员,可以访问所需的 Admin SDK 服务。

您不会通过将代码放入库中来实现这一点,因为无法“委托”执行库函数:库函数将在执行菜单函数的用户的权限下运行。

解决办法:

在这种情况下,我建议以下替代方案:

  1. 创建service account
  2. 按照this guide 授予服务帐户域范围的委派,以便它可以用来模拟您域中的任何帐户:在这种情况下,是您的帐户。
  3. 导入并使用库 OAuth2 for Apps Script 以便在您的 Apps 脚本项目中使用服务帐户。
  4. 使用UrlFetchApp 调用所需的API,使用服务帐户的访问令牌。

代码示例:

例如,如果您想调用 Directory API 的 users.get 以从当前执行此操作的用户那里检索数据,您可以执行以下操作:

function getService() {
  const service = OAuth2.createService("Service account")
                    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
                    .setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
                    .setIssuer(SERVICE_ACCOUNT_EMAIL)
                    .setSubject(IMPERSONATED_EMAIL)
                    .setPropertyStore(PropertiesService.getScriptProperties())
                    .setParam('access_type', 'offline')
                    .setScope('https://www.googleapis.com/auth/admin.directory.user')
  return service;
}

function getActiveUserData() {
  const service = getService();
  if (service.hasAccess()) {
    const userKey = Session.getActiveUser();
    const url = `https://admin.googleapis.com/admin/directory/v1/users/${userKey}`;
    const options = {
      headers: {
        'Authorization': "Bearer " + service.getAccessToken(),
        'Content-Type': 'application/json'
      },
      muteHttpExceptions: true
    }
    const resp = UrlFetchApp.fetch(url, options);
    const userData = JSON.parse(resp.getContentText());
    return userData;
  }
}

【讨论】:

  • 谢谢@Iamblichus。是的,这将解决普通用户过多的 API 权限。但是你提到了编辑器插件,但我所有的脚本都只是普通的库。我最担心的是我的情况,我需要以“编辑”权限共享我的代码,以查看为他们工作的功能。默认情况下,读取权限应该足够了,但是如果我尝试从工作表手动运行 Script.loadMenu() 函数,则会出现以下错误。
  • 错误消息:“我们很抱歉,从存储读取时发生服务器错误。错误代码 NOT_FOUND” 通过对库的读取权限,他们可以读取库脚本并查看源代码。但在这种情况下,代码在工作表中不再起作用。
  • 我能够使库以只读访问权限工作,如果我使用其中的版本号,而不是 appscript.json 中的开发模式 "libraries": [ { "userSymbol": "Script", "libraryId": "........", "version": "1..." } ] 想法来自这里link
  • 谢谢@Iamblichus,我将接受您的回答,因为您帮助了如何使用服务帐户而不是向用户提供过多的 API 访问权限。
  • @gabriel7 由于您在问题中多次提到附加组件,我以为您正在使用它。无论如何,我知道你的问题现在已经解决了,我很高兴。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多