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

How to transfer data from webapp to addon

  1. Project_1 是容器绑定脚本。容器是可读的传播sheet(模板)。

Code_1:

function doPost(e) {
  return HtmlService.createHtmlOutput(JSON.stringify(e));
}

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

的所有者
  1. Project_2 是作为附加组件部署的脚本。第 1 点的用户不是 Project_2.
  2. 的所有者

Code_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)。

  1. addon -> webapp 方向的流程很好:当 sendPost() 启动时,它向 webapp 发送一个请求并收到一个响应,其中包含必要的 data_1 作为响应。

流向“网络上的某人”-> webapp 的流向也很好:当请求 webapp_url 接收到传输的 data_2.

  1. 我正在尝试将 data_2 转移到插件。 我读了很多关于 scripts.run 的内容,但似乎这个选项不适用于这种情况。 也没有地方可以添加eventListener。

  2. 我不想从我的帐户部署 webapp,以免将我的 quota 用于同时执行 (<= 30)。 我也不想在 spreadsheet 中做侧边栏等,并尝试将 eventListener 拧到 html。我假设使用这种方法,只有当 ui 处于活动状态时(传播 sheet 处于打开状态且侧边栏处于活动状态),侦听器(如果可以将其添加到那里)才会处于活动状态。数据可以在一天中的任何时间到来,必须立即传输到插件。

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

Added_2: 我要分配赏金,所以我从评论中转移到 post 中缺少的内容并更新问题本身。

我拒绝了立即进入 sheet 的选项,因为这会导致不断调用价差sheet 并降低整个系统的性能。

我知道 Google 云函数和 Google 计算引擎的存在,但我想保持在免费配额内。

问题:如何将数据从 webapp 传输到插件并执行 func () 或使用哪种解决方法来实现目标?

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

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

我了解到评论中提出的其他人和我自己的解决方案无法在您的场景中工作,因为它不能承受平均延迟 30 秒。在那种情况下,我强烈建议您设置一个可以用作即时服务器的 Cloud 项目,而不是 triggers/apps/etc.

这是您的要求列表:

  • 从某些外部请求将 add-on 代码触发到 运行,而不是使用 add-on 用户界面或基于时间的触发器。
  • 来自用户帐户的代码 运行s,使用他们的配额
  • 运行 add-on 代码,无论用户是否使用 add-on。例如,他们的 Google Sheet 已关闭,用户甚至可能被注销。

我只知道一种方法,它是 Sheet 的 add-on,通过在 Sheet 中设置一个值来触发“On Change”事件使用 Sheets API 的单元格。 Sheets API 必须使用特殊选项来设置值“作为用户”。

特殊设置为:

valueInputOption=USER_ENTERED

即使 Sheet 关闭,该选项也会触发“On Change”事件。 显然,发出请求的脚本需要用户授权才能在 Sheet 的单元格中设置值。 如果发送请求的脚本在用户帐户之外,那么您需要使用 OAuth。 add-on 需要为 Sheet 安装一个“On Change”触发器,触发器绑定到的函数需要确定更改是否来自为此特殊功能指定的特殊单元格。

如果在用户 Sheet 中设置值的请求来自该用户 Google 帐户之外,那么 Sheet 的用户将需要以某种方式授权 OAuth Sheets API 更改 Sheet.

的凭据

根据 Google Sheets API 使用的编程语言,可能会有一个 Sheets API 库专门用于语。您还可以使用 Sheets REST API.

Whosebug 上有一个使用来自 Apps 脚本的 Sheets REST API 的示例,但如果外部请求来自某些非 Apps 脚本的代码,它不会'不完全一样。