如何将数据从 webapp 传输到插件

Posted

技术标签:

【中文标题】如何将数据从 webapp 传输到插件【英文标题】:How to transfer data from webapp to addon 【发布时间】:2021-12-15 18:33:29 【问题描述】:
    Project_1 是一个容器绑定脚本。容器是可读的电子表格(模板)。

代码_1:

function doPost(e) 
  return htmlService.createHtmlOutput(JSON.stringify(e));

用户制作模板的副本,将脚本 (Project_1) 部署为具有以下权限的 web 应用程序:“执行身份:我,有权访问:任何人”。用户是 Project_1 的所有者。

    Project_2 是作为插件部署的脚本。第 1 点的用户不是 Project_2 的所有者。

代码_2:

function sendPost() 
  var sheetURL = SpreadsheetApp.getActiveSpreadsheet().getUrl();

  var webAppUrl = "https://script.google.com/macros/s/###/exec"; // 7: Part_1 - WebApp: Tester

  // var auth = ScriptApp.getOAuthToken();
  // var header =  'Authorization': 'Bearer ' + auth ;
  var payload =  scriptName: 'updateData', sheetURL: 'sheetURL' ;
  var options = 
    method: 'post',
    // headers: header,
    muteHttpExceptions: true,
    payload: payload
  ;

  var resp = UrlFetchApp.fetch(webAppUrl, options);
  var respTxt = resp.getContentText();
  console.log('resp: ' + respTxt);


function doPost(ev) 
  var respWebapp = func(ev);

用户安装插件 (Project_2)。​​

    addon -> webapp 方向的流程很好:当 sendPost() 启动时,它会向 webapp 发送一个请求,并接收带有必要 data_1 作为响应的响应。

“网上有人”方向的流程 -> webapp 也很流畅:请求一个 webapp_url 时接收到传输的 data_2。

    我正在尝试将 data_2 传输到插件。 我阅读了很多关于 scripts.run 的内容,但似乎此选项不适用于这种情况。 也无处添加事件监听器。

    我不想从我的帐户部署 webapp,以免将我的 quota 用于同时执行 (

添加: 我觉得我被难住了。因此,我与社区联系,希望有人会针对这些初始数据提出解决方法或新策略。初始数据是指为 30 多个用户提供双向交换消息的机会电子表格 外部服务(例如 Telegram),同时不低于 30 个同时执行脚本的限制。

已添加_2: 我要分配赏金,所以我从 cmets 把帖子中缺少的内容转移到这里并更新问题本身。

我拒绝了立即进入工作表的选项,因为这会导致不断调用电子表格并降低整个系统的性能。

我知道谷歌云功能和谷歌计算引擎的存在,但希望保持在免费配额内。

问题:并执行 func() 或使用哪种解决方法来实现目标?

【问题讨论】:

@TheMaster "用户......将脚本 (Project_1) 部署为具有权限的 web 应用程序:"执行为:我,有权访问:任何人""。用户不会花费我的,而是他的配额。 Google Apps 脚本工作区编辑器没有传入/传出端点来从外部代码获取数据,因此您必须重新考虑您的解决方案。 请相应地更新问题。附言其中一种可能性是将电子表格用作数据库,以供“Code_1”和“Code_2”用作数据存储。 您可以查看外部资源,例如 firebase 或数据库。然后你可以从 webapp#2 进行投票。当然,如果你愿意接受 30 的 se,你总是可以从你的插件部署 webapp#2。或者,with a Google account, but a service. 可以让服务以用户身份运行? 50 个用户几乎不可能同时发送一个命令。只要您的 web 应用程序速度快并且执行时间低于 30 秒左右,我认为这对 50 个用户来说不是问题。如果您担心,请查看专业的服务器/域,例如谷歌云功能、谷歌计算引擎。 【参考方案1】:

我了解其他人和我自己在 cmets 中提出的解决方案无法在您的场景中运行,因为它无法承受 30 秒的平均延迟。在这种情况下,我强烈建议您设置一个可用作即时服务器的Cloud 项目,而不是触发器/应用程序/等。

【讨论】:

看起来像。首先,配额和限制的栅栏不允许使用每 1-2 秒请求一次外部数据的触发器。其次,与插件的连接是单向的。无法在内部传输数据。如果可以将标志发送到新数据已到达的插件就好了。然后就可以从插件内的外部源请求数据。 希望集体智慧会提出一些建议,但它没有实现。因此,仅保留基于云的功能。但正如我在帖子中所写,我想保持在免费配额内。重点不在于这是一项付费服务​​。关键是,我对此一无所知。而且没有好的手册。【参考方案2】:

在“Code_1”和“Code_2”中使用共享数据存储。换句话说,不是直接将数据从“Code_1”传递到“Code_2”,而是让 Code_1 写入数据存储区并从其中读取“Code_2”。

其中一种可能性是将电子表格用作数据库。在这种情况下,您可以在电子表格被“Code_1”脚本之一更改时使用更改触发器来执行某些操作和/或使用时间驱动的触发器以特定频率或在特定日期时间执行某些操作。

【讨论】:

是的,现在 Project_1 和 Project_2 共享 PropertyService。但我担心插件(Project_2)“属性读取/写入50,000 /天”会有限制。而且我想不出如何让 Project_2 响应属性更改。这就是我写有关 EventListener 和 scripts.run 的原因。我没有想到要使用 onChange,因为我认为它只会在用户更改而不是脚本更改时触发。 在项目的第一个版本中,脚本 Project_1 和 Project_2 组合在一起。在测试时,它在代码的许多部分中,将输出安装到自定义记录器中,并在工作表上记录。同时,一些用户注意到向机器人发送消息与其响应消息之间的延迟长达 10 秒。在我删除所有日志记录后,延迟不超过 1 秒。因此,我拒绝了立即进入工作表的选项,因为这会导致对电子表格的持续访问并降低整个系统的性能。 使用定时触发器也会产生类似的问题。也许我可以在触发器触发之间设置一个最小延迟(1 秒?我没有在任何地方看到最小数字)。我从来没有使用过这种时机的触发器。因此,我不知道整个项目如何正确地使用这样的触发器。如果每秒有数千个脚本被敲入 Google 服务器会有什么感觉 =) 此外,很有可能会遇到“触发器总运行时间 90 分钟/天”的限制。 也许您应该退后几步,想想是什么导致了需要用户发布网络应用而不是要求他们使用同一个网络应用的解决方案。 除了 Tanaike 和 Master 已经说过的话,我认为最后一个声明通过提到附加组件来实现很大的飞跃,因为所有 previos 问题的开发都只是关于 web 应用程序。可能的建议是集中了解网络应用部署选项的工作原理。

以上是关于如何将数据从 webapp 传输到插件的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 UITableViewCell 传输到另一个 UIViewController?

如何将数据从一个片段传输到另一个片段android

如何将数据从 SQL Server 传输到 Informix,反之亦然

如何将 elasticsearch 数据从一个数据目录传输到另一个数据目录?

如何将数据从模态 ViewController 传输到父 ViewController?

如何将数据从一个表传输到另一个表