"SpreadsheetApp.getUi() cannot be called from this context"

"SpreadsheetApp.getUi() cannot be called from this context"

在 Google Sheets 电子表格中,我想显示一个从 HTML 创建的模态对话框,然后 运行 一个函数,然后自动关闭 HTML 提示。

对话框应该一直保留到函数执行完毕,然后自动消失。

此过程必须每 3 小时重复一次,并且脚本需要像我一样 运行(因为我拥有其他用户没有的编辑权限)所以简单的触发器可能无法工作(我'我读过,如果您希望函数 运行 像您一样而不是当前用户在给定时间的任何人,则必须创建一个可安装的触发器)

我目前有:

  1. 一个 .gs 函数 Magic_Telling,它使用 HTML 文件
  2. 创建模式对话框
  3. 一个 HTML 文件 Prompt_Styling,其中包含提示的 css / html 样式。这个 HTML 文件然后调用一个 .gs 函数 All_In 来处理行

我的代码:

Magic_Telling 从 HTML 文件创建模态对话框。

function Magic_Telling() {
var UI = SpreadsheetApp.getUi();
var newline = '\n'
// Display a modal dialog box with custom HtmlService content.
var htmlOutput = HtmlService.createHtmlOutputFromFile('PromptStyling')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME)
    .setWidth(300)
    .setHeight(100);
UI.showModalDialog(htmlOutput, ' ');
}


Prompt_Styling HTML 样式提示文件 + 运行 函数 All_In 将处理行

的脚本
<html>
<head>
// some irrelevant stuff here
</head>

<script>
window.onload = function() {    
google.script.run
    .withSuccessHandler(closeDialog)
    .All_In();
    };

window.closeDialog = function() {
    google.script.host.close();
    };

</script>
</html>

All_In 处理行的函数

function All_In() {

UnlockRowBlocks();
UnhideRowBlocks();
LockRowBlocks();
HideRowBlocks();

}

当我从脚本编辑器 运行 MagicTelling 时,它非常漂亮。整个序列执行(显示提示,执行 All_In,提示消失)。完美。

然后我创建了一个可安装的触发器 脚本编辑器 > 资源 > 当前项目的触发器 并每 3 小时向 运行 Magic_Telling 添加一个触发器。 (我猜这是一个 "installable trigger")

但我收到此错误消息:

Cannot call SpreadsheetApp.getUi() from this context.

...当函数到达Magic_Telling

的第一行时

我应该怎么做才能解决这个问题?

Ui 对话框 不能 由时间触发函数调用,它们必须由用户操作触发,也就是说单击菜单项或调用显示 UI.

函数的某种按钮

对于刚开始使用 Tools/Scripteditor 菜单编写脚本的每个人来说,出现 'Cannot call SpreadsheetApp.getUi() from this context.' 错误的简单案例。

在这种情况下,您仅使用独立脚本,这意味着您的脚本仅附加到一个文档或电子表格。 独立脚本允许即简单地调用 doc = DocumentApp.getActiveDocument(),脚本附加到的活动文档。

我碰巧用了'var ui = SpreadsheetApp.getUi();'在此处获取错误消息时...... 当我一直走到 Oauth Scopes 和 Developer Console 时,我花了几个小时才找出这条简单的线出了什么问题。

所以,对于一些初学者来说,知道我实际上使用了 var ui = SpreadsheetApp.getUi(); 可能会有所帮助。在文档脚本中。 很明显我得到了错误,但是...... 希望这对一些简单的脚本编写者有帮助!

PS。我希望不用说使用 'var ui = DocumentApp.getUi();' 在 SpreadSheet 中将产生类似的错误消息。

如果发生此错误,请检查触发器或关闭脚本编辑器选项卡并刷新 google 工作表,然后打开脚本项目。

确保 appscript 是绑定脚本而不是独立脚本。否则 getUi() 将无法工作。

在这里查看我所有关于 appscript 的课程http://playlist.mashoun.com/