" SpreadsheetApp.getUi()无法从此上下文调用"

时间:2016-03-20 17:36:38

标签: google-apps-script triggers modal-dialog serverside-javascript client-side-scripting

是:
Google表格(新)

目的:
在电子表格中,显示从HTML创建的模式对话框,然后运行一个函数,然后自动关闭该HTML提示。 对话框一直保持到函数完成执行,然后自动消失。这个过程必须每3个小时重复一次,脚本需要像我一样运行(因为我有其他用户没有的编辑权限)这么简单的触发器可能无法工作(我已经读过你必须如果您希望函数以您的方式运行而不是当前用户在给定时间的任何人运行,则创建一个可安装的触发器)

我有什么:

  1. .gs函数Magic_Telling,使用HTML文件创建模态对话框
  2. 一个HTML文件,Prompt_Styling,包含提示的css / html样式。然后,该HTML文件调用处理行的.gs函数All_In(
  3. 我的代码 这是我的第一个剧本,所以请不要太反感!

    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执行,提示消失)。完美。

    然后我通过转到创建了一个可安装的触发器     脚本编辑器&gt;资源&gt;当前项目的触发器 并添加了一个触发器,每3小时运行一次Magic_Telling。 (我认为这是一个&#34;可安装的触发器&#34;)

    问题: 我收到一条错误消息......

    Cannot call SpreadsheetApp.getUi() from this context.
    

    ...当函数到达Magic_Telling的第一行

    我该怎么做才能解决这个问题?请帮助,并提前感谢您的慷慨。我很乐意提供您需要的尽可能多的细节。真的非常感谢任何帮助,完全迷失在这里。

2 个答案:

答案 0 :(得分:6)

Ui Dialogs 不能被时间触发的功能调用,它们必须由用户操作触发,也就是说点击菜单项或某种调用功能显示的按钮用户界面。

答案 1 :(得分:0)

获取“无法从该上下文调用 SpreadsheetApp.getUi()”的简单案例。对于刚开始使用工具/脚本编辑器菜单编写脚本的每个人来说都是错误的。

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

碰巧我使用了'var ui = SpreadsheetApp.getUi();'在此处获取 ERROR 消息时... 当我一路深入到 Oauth Scopes 和开发者控制台时,我花了好几个小时才发现这条简单的代码出了什么问题。

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

附注。我希望不用说使用'var ui = DocumentApp.getUi();' 在电子表格中会产生类似的错误消息。