【问题标题】:How to call web app from a google sheet bound script to modify the sheet如何从谷歌工作表绑定脚本调用网络应用程序来修改工作表
【发布时间】:2019-09-05 15:29:46
【问题描述】:

我正在尝试制作一个可以由 Google 工作表的绑定脚本触发的 WebApp,以在我的权限下修改工作表。我尝试过使用可安装的触发器,但我需要的功能比它们提供的更多。

我复制并粘贴代码 Google Apps Script: Temporarily run script as another user 并试图使其正常运行,但不断收到相同的错误Exception: Request failed for https://script.google.com returned code 401. Truncated server response:,然后是页面的 HTML。我什至很难获得这个工作的基本版本,上面的链接是我找到的最/唯一相关的指南。

以下是我尝试获得基本功能的尝试(它返回与上述相同的错误)。如果我在浏览器中打开网络应用程序,它会成功将 1 添加到第一个单元格,但我无法弄清楚如何从工作表的绑定脚本中正确调用网络应用程序。

来自电子表格的绑定脚本:

function myFunction() {
  UrlFetchApp.fetch('web app url');
}

来自网络应用程序:

function doGet() {
  var ss = SpreadsheetApp.openById('spreadsheet id');
  var sheet = ss.getSheetByName('Sheet1');
  var cell = sheet.getRange(1, 1);
  cell.setValue(cell.getValue() + 1);
}

我只需要一个有效的例子。之后,我可以从那里拿走它。

【问题讨论】:

  • 阅读this
  • 现在阅读,谢谢!
  • 他们在大多数示例中使用 curl。这是我第一次遇到卷曲。我正在尝试的东西是否有必要,或者只是他们的偏好?对于这个项目,我宁愿现在不必学习它,但如果有必要,我会的。
  • 不需要卷曲。 curl 和应用程序脚本中都提供了示例脚本。您需要在获取请求中发送访问令牌。此外,对 DriveApp.getFilesBy...() 进行虚拟调用以在访问令牌中包含驱动器范围。

标签: google-apps-script google-sheets web-applications http-status-code-401


【解决方案1】:

试试这个:

这是以我的身份运行的,只有我可以访问它。所以你不妨修改一下。

function myFunction() {
  Logger.log(ScriptApp.getService().getUrl());
  var url=ScriptApp.getService().getUrl();
  var params = {
    method: "get",
    headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
  };
  UrlFetchApp.fetch(url,params);
}

function doGet() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet1');
  sh.getRange("A1").setValue(sh.getRange("A1").getValue() + 1);
  var html=Utilities.formatString('Process Complete: Current Value: %s',sh.getRange("A1").getValue());
  return HtmlService.createHtmlOutput(html);
}

这些是我添加的范围:

"oauthScopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/spreadsheets"]

【讨论】:

  • 我已经尝试了我能想到的这段代码的所有变体,但我似乎遗漏了一些东西。据我了解,myFunction() 进入绑定脚本,doGet() 进入网络应用程序。这对我来说不太有意义,因为ScriptApp.getService().getUrl() 只能在网络应用程序中工作(对吗?)。所以我尝试用网络应用程序中的 url 替换它,这仍然返回 401 错误。我应该手动输入这些范围,还是应该有我遗漏的提示?
  • 如果清单文件没有,您是否也将范围添加到清单文件中。
  • 我明白了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多