【问题标题】:Creating an onEdit trigger on a sheet owned by a service account在服务帐户拥有的工作表上创建 onEdit 触发器
【发布时间】:2021-12-15 17:32:17
【问题描述】:

我有一个归服务帐户所有的 GSheet,我想添加一个“编辑时”触发器来接收实时编辑通知。

到目前为止,我已经尝试过/看过:

  • 只需将 onEdit 函数添加到绑定脚本中,但是 Google 不允许在脚本上运行 Apps Script(更多讨论问题here):

Google Apps 脚本:该脚本无法运行,因为它归服务帐户所有。请在运行前将项目复制或转移到有效帐户。

还有其他想法吗,或者 Google 根本不允许 Apps 脚本在服务帐户下运行这一事实是否会成为阻碍?”

【问题讨论】:

  • however other requirements require the GSheet to remain belonging to the service account. 喜欢什么?
  • 正如您从官方文章中分享的,警告 Warning: The Apps Script API doesn't work with service accounts. 已经发布。但是,这个similar answer 有一个可能的解决方法,但我不确定它是否理想/是否符合您的要求。除此之外,这似乎几乎不可能实现您的目标,也许您可​​能需要考虑将其作为功能请求发送到 Issue Tracker
  • @TheMaster 目前我所知道的工作表是由第三方应用程序创建的,但我会看看这个要求有多难和快。
  • @IrvinJayG.Interesting idea,但我认为 Script API 不能用于创建触发器。但我将研究简单地使用另一个帐户拥有的独立脚本来创建指向 GSheet 的 onEdit 触发器。
  • 我提出了一个解决方法作为答案。你能确认一下吗?如果这对您的情况没有帮助,我深表歉意。

标签: google-apps-script triggers service-accounts


【解决方案1】:

我相信你的目标如下。

  • 您有一个由服务帐户创建的 Google 电子表格。
  • 您想在此电子表格上使用 OnEdit 触发器。

问题和解决方法:

不幸的是,在当前阶段,Google 电子表格的所有者是服务帐户。无法运行 Google Apps 脚本。这样,即使将onEdit 函数放入脚本编辑器,该脚本也无法运行。看来这就是目前谷歌方面的规范。不幸的是,在当前阶段,您的目标无法直接实现。我认为这是您问题的当前答案。

但是,我认为可以提出一种解决方法。幸运的是,电子表格的内置功能也可以在服务帐户创建的电子表格中使用。我认为这可能可以用作解决方法。

当我看到你的问题时,我想起了我的帖子。

我认为当使用这些帖子时,可能会提出一种解决方法。在这个答案中,我想提出一个解决方法来实现您的目标。因此,请将此视为伪 OnEdit 触发器。

此变通方法的流程如下。

  1. 准备 Web 应用程序。
    • 此 Web Apps 部署在由可以运行该脚本的帐户创建的 Google Apps 脚本项目中。请注意这一点。
  2. 当在“Sheet1”中使用伪 OnEdit 触发器时,将IMPORTXML 放到另一个工作表中(例如,它是“Sheet2”。)。 IMPORTXML 对 Web 应用程序的请求。
    • 此电子表格是由服务帐户创建的电子表格。
  3. 编辑“Sheet1”中的单元格时,会运行“Sheet2”中的公式。

通过此流程,当编辑“Sheet1”中的单元格时,可以运行 Web Apps 的 Google Apps 脚本。这是作为此解决方法的伪 OnEdit 触发器。

用法:

1。为 Web 应用程序创建 Google Apps 脚本。

为了使用网络应用程序,请使用可以运行脚本的帐户创建 Google Apps 脚本项目。在这种情况下,作为示例情况,请使用您的帐户而不是服务帐户创建 Google Apps 脚本项目。

2。示例脚本:

请将以下脚本复制并粘贴到已创建的 Google Apps 脚本项目的脚本编辑器中。

function doGet(e) {

  // do something
  // Please set the script you want to use.

  return ContentService.createTextOutput(`<result>Edited at ${new Date().toISOString()}</result>`).setMimeType(ContentService.MimeType.XML);
}

3。部署 Web 应用程序。

详细信息可见the official document

  1. 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
  2. 请点击“选择类型”->“Web App”。
  3. 请在“部署配置”下的字段中输入有关Web App的信息。
  4. 请为“执行为”选择“我”
    • 这是此解决方法的重要性。
  5. 请为“谁有权”选择“任何人”
    • 在您的情况下,我认为此设置可能合适。
  6. 请点击“部署”按钮。
  7. 复制 Web 应用程序的 URL。就像https://script.google.com/macros/s/###/exec

3。测试。

  1. 请在服务帐户创建的 Google 电子表格中准备 2 张工作表。它们是“Sheet1”和“Sheet2”。

  2. 请将下列公式代入“Sheet2”的“A1”。在这种情况下,请使用您的 Web Apps URL。并且,请确认该值是从部署的 Web 应用程序返回的。如果无法完成,请再次检查上述流程。

     =IMPORTXML("https://script.google.com/macros/s/###/exec?values="&TEXTJOIN(",",TRUE,Sheet1!A:Z),"/result")
    
    • 此公式是一个示例公式。所以,请根据您的实际情况修改范围和公式。
  3. 请编辑“Sheet1”上的单元格。使用上述公式时,请编辑“A:Z”中的单元格。由此,“Sheet2”的单元格“A1”被刷新,通过该刷新,运行Web Apps的Google Apps Script。这是作为此解决方法的伪 OnEdit 触发器。

注意:

  • 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映在 Web Apps 中。请注意这一点。
  • 你可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中看到这个细节。
  • 在此解决方法中,我认为您可以通过检查编辑表前后的差异来检索已编辑的单元格。但是,这是一个用于解释此解决方法的简单脚本。因此,如果您使用此解决方法,请根据您的实际情况修改脚本。

参考资料:

【讨论】:

  • 哇!这是一个令人印象深刻且光荣的迂回解决方法。谢谢,知道我可以指望你:)
  • @Andrew Roberts 感谢您的回复。当我看到你的问题时,我偶然想起了我的2个帖子。通过这个,我想出了这个解决方法。如果这对您的情况有用,我很高兴。作为使用此解决方法的另一个示例情况,您可以在 this post 看到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多