"Authorisation is required to perform that action" 用于 alert/popup,Google 适用于电子表格的 Apps 脚本插件

"Authorisation is required to perform that action" for alert/popup, Google Apps Script add-on for Spreadsheets

我正在为 Google Spreadsheets 构建一个 Google Apps 脚本插件。

在清单中,我已明确请求以下范围: "https://www.googleapis.com/auth/script.container.ui", “https://www.googleapis.com/auth/spreadsheets

我的 Google 云项目中的 "OAuth consent screen" 也具有相同的范围,并且这些已经由 Google 验证。

然而,如果输入错误,我无法向我的用户提供反馈。我尝试了以下方法:

似乎没有任何效果,我总是在 stackdriver 日志中看到错误 "Authorisation is required to perform that action"。

可行的方法是创建一个 "error sheet" 并将所有输入错误记录到其中,或者将主 sheet 中的一个单元格设为 "error cell" 并记录所有输入错误进去。我认为这在用户体验方面不是一个很好的解决方案。

看来这个问题与authMode有关:https://developers.google.com/gsuite/add-ons/concepts/editor-auth-lifecycle#authorization_modes 因为"Access to user interface"只有在"FULL"authMode内才有可能,在onEdit()期间是不行的。

奇怪的是,其他加载项能够显示 alert/popup。这是黑客攻击吗?或者我需要更多的范围?或者我还需要更改其他内容吗?

编辑 2019 年 10 月 8 日:

@Jacques-Guzel Heron: 例如:用户在单元格 A1 中输入一个日期,在单元格 B1 中输入另一个日期。在 onEdit(e) 触发器中,我想检查 B1 中的日期是否晚于 A1 中的日期,如果不是,我想提醒用户。发布应用程序时,上面列出的所有方法都会导致错误 "Authorisation is required to perform that action"。当应用程序未发布时,.toast()、.alert() 和 .msgBox() 在我的测试环境中工作。奇怪的是,这些方法随后创建了一个 DIV 元素,而其他附加组件为其 alert/dialog-box 创建了一个 IFRAME 元素。因此我认为他们使用了另一种方法,它与范围无关。此外,我还查看了这些附加组件的 OAuth 验证过程,范围列在开发工具中。他们没有使用任何特殊的 "ui-scope",所以我怀疑这个错误的原因是范围相关的。

编辑 2019 年 10 月 9 日: 现在我知道如何制作包含 IFRAME 元素的 alert/dialog-box 了。为此,可以使用以下方法:

var htmlString, msg, htmlOutput;

htmlString = '<p>my html string</p>';
msg = 'my message';

htmlOutput = HtmlService
    .createHtmlOutput(htmlString)
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setHeight(140);

SpreadsheetApp
    .getUi()
    .showModalDialog(htmlOutput, msg);

但是在onEdit(e)的时候也不可能调用这个方法。

上面列出的所有方法都可以通过单击菜单项和侧边栏中的按钮来调用,但不能在 onEdit(e) 期间调用。

此外,我已经添加了所有其他附加组件正在使用的范围,但都是徒劳的。所以我的假设再次得到证实,问题与范围无关。

我的印象是一些聪明人设法找到了一个非正式的解决方法,请告诉我:)

您的所有方法都是正确的。是的,这是 authorization modes.

上记录的预期行为

这些加载项使用 custom menus 来使用一个公式,在调用按钮后检查单元格。

在该文档中,您可以找到开发警报的信息。请描述您要完成的工作,以便我更好地帮助您,否则请毫不犹豫地要求我提供更多说明。

解决方案是可安装的触发器:https://developers.google.com/apps-script/guides/triggers/installable

他们 运行 处于 FULL authMode,因此被允许访问用户界面:https://developers.google.com/gsuite/add-ons/concepts/editor-auth-lifecycle#authorization_modes