在服务帐户拥有的工作表上创建onEdit触发器 [英] Creating an onEdit trigger on a sheet owned by a service account
问题描述
我有一个属于服务帐户的GSheet,我想添加一个"On Edit"触发器来接收实时编辑通知。
到目前为止,我已尝试/查看:
- 只需将onEdit函数添加到绑定的脚本中,但Google不允许在脚本上运行Apps脚本(问题将在后面讨论here):
Google Apps脚本:该脚本无法运行,因为它属于服务帐户。请在运行之前将项目复制或转移到有效帐户。
驱动器API推送通知-但这不能提供所需的每个单元的详细信息,而且响应速度也不够快;根据this SO post,最长可达3分钟。
更改GSheet的所有权-但是,其他要求要求GSheet保持属于服务帐户。
使用脚本API-但是它isn’t allowed to create triggers,而且无论如何service accounts can’t use the Script API。
还有其他想法吗,或者Google根本不允许Apps脚本在服务帐户下运行这一事实是一种作秀障碍吗?"
推荐答案
我相信您的目标如下。
- 您有一个由服务帐户创建的Google电子表格。
- 您要在此电子表格上使用OnEdit触发器。
问题和解决方法:
在当前阶段,不幸的是,当Google电子表格的所有者是服务帐户时。无法运行Google Apps脚本。这样,即使将onEdit
函数放到脚本编辑器中,也无法运行该脚本。看来这是目前谷歌方面的规范。不幸的是,在目前阶段,您的目标不能直接实现。我认为这是您问题的当前答案。
但是,我认为或许可以提出一种解决办法。幸运的是,电子表格的内置功能也可以在服务帐户创建的电子表格中使用。我认为这或许可以用作解决办法。
当我看到您的问题时,我想起了以下帖子。
- Automatic Recalculation of Custom Function on Spreadsheet Part 1
- Letting Users Running Google Apps Script on Google Spreadsheet without both Authorizing Scopes and Showing Script
我认为当使用这些帖子时,或许可以提出解决办法。在此回答中,我想提出一种实现您目标的解决方法。因此,请将其视为伪OnEdit触发器。
此解决方法的流程如下所示。
- 准备Web应用程序。
- 此Web Apps部署在Google Apps脚本项目中,该项目由可以运行该脚本的帐户创建。请注意这一点。
- 在";Sheet1";中使用伪OnEdit触发器时,将
IMPORTXML
放到另一个工作表中(例如,它是";Sheet2";.)。IMPORTXML
对Web应用程序的请求。- 此电子表格是由服务帐户创建的电子表格。
- 编辑";Sheet1";中的单元格时,将运行";Sheet2&Quot;中的公式。
通过此流程,当编辑";Sheet1";中的单元格时,可以运行Web Apps的Google Apps脚本。这是此解决方法的伪OnEdit触发器。
用法:
1.为Web应用创建Google Apps脚本。
要使用Web 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。
- 在脚本编辑器中,请单击脚本编辑器右上角的";,单击Deploy&Quot;->;&Quot;New Deployment&Quot;。
- 请单击";Select type";->;";Web App";。
- 请在";Deployment Configuration&Quot;下的字段中输入有关Web App的信息。
- 请为";选择";Me";作为";执行。
- 这就是此解决方法的重要性。
- 请为";有访问权限的";选择";任何人(&/strong>)。
- 考虑到您的情况,我认为此设置可能合适。
- 请单击"部署&q;"按钮。
- 复制Web应用的URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改Google Apps脚本时,请将部署修改为新版本。由此,修改后的脚本反映在Web应用程序中。请小心此操作。
- 您可以在";Redeploying Web Apps without Changing URL of Web Apps for new IDE";的报告中查看这方面的详细信息。
3.测试。
请在服务帐户创建的Google电子表格中准备2张工作表。它们是";Sheet1";和";Sheet2";。
请将以下公式放在";Sheet2";的";A1";中。在这种情况下,请使用您的Web Apps URL。并且,请确认该值是从部署的Web应用返回的。如果无法执行此操作,请再次检查以上流程。
=IMPORTXML("https://script.google.com/macros/s/###/exec?values="&TEXTJOIN(",",TRUE,Sheet1!A:Z),"/result")
- 此公式是示例公式。因此,请根据您的实际情况修改范围和公式。
请编辑";Sheet1";上的单元格。使用上述公式时,请编辑&QOOT;A:Z&QOOT;中的单元格。由此,刷新了";Sheet2";的单元格&q;A1&q;,并且通过该刷新,运行了Web Apps的Google Apps脚本。这是此解决方法的伪OnEdit触发器。
注意:
- 当您修改Google Apps脚本时,请将部署修改为新版本。由此,修改后的脚本反映在Web应用程序中。请小心此操作。
- 您可以在";Redeploying Web Apps without Changing URL of Web Apps for new IDE";的报告中查看这方面的详细信息。
- 在此解决方法中,我认为您可以通过检查编辑工作表前后的差异来检索编辑的单元格。但是,这是一个解释此解决方法的简单脚本。因此,如果您使用此解决方法,请根据您的实际情况修改脚本。
引用:
这篇关于在服务帐户拥有的工作表上创建onEdit触发器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!