Google电子表格应用脚本库是否可以包含用户对话框?

时间:2014-12-28 04:05:55

标签: google-apps-script google-sheets

Google电子表格使用的Apps脚本库中可能存在限制吗?具体来说,库可以包含HTML对话框吗?

我创建了一个电子表格脚本,添加了一个菜单项,向用户显示一个对话框。它用     HtmlService.createHtmlOutputFromFile('mappingForm').setSandboxMode(HtmlService.SandboxMode.IFRAME)

https://developers.google.com/apps-script/guides/html/communication中所述。 HTML文件包含带有jQuery的HTML,CSS和JavaScript。它使用google.script.run使用电子表格中的数据填充对话框并向其提交表单。

这一切在原始电子表格中都能正常工作。

我需要使用多个电子表格才能使用相同的代码,因此我尝试按照Google Spreadsheet Scripts shared across spreadsheets (not libraries)的一般概念来制作包含电子表格模板和多个副本的主脚本。

我按照https://developers.google.com/apps-script/guide_libraries处的说明从原始电子表格创建了一个库。当另一个电子表格使用该库时,我能够显示对话框,但是所有回调到服务器的回调(填充对话框或提交表单)都会失败,并且{ {1}}作为具有属性的google.script.run.withFailureHandler对象:

Error

我已经在应用程序脚本中放置了Logger调用,以查看是否正在调用服务器端函数但是没有一个被命中。脚本编辑器的执行记录显示:

  

[14-12-27 19:38:05:340 PST]开始执行

     

[14-12-27 19:38:05:372 PST]执行失败:我们很抱歉,发生了服务器错误。请稍等一下再试一次。 [总运行时间0.0秒]

客户端正在进行呼叫,但在到达电子表格脚本之前,某些内容失败了。

这让我想知道是否

  1. 我需要做一些不同的代码才能使代码充当库。
  2. 图书馆不能有对话框。
  3. 有服务器错误。
  4. 提前感谢任何建议。

1 个答案:

答案 0 :(得分:4)

通过执行以下操作,我能够拥有一个包含HTML对话框的工作库。

  1. 将脚本和HTML文件从原始电子表格移至standalone script项目。在文件>的信息标签中记下图书馆的项目密钥。项目属性...... 。任何打算使用该库的电子表格都需要它。

  2. 如果其他人使用独立脚本项目,请点击其共享按钮,使其可以与任何有链接的人共享,否则它将无声地失败。

  3. 如果HTML对话框需要回调库函数(获取或提交数据),则库函数必须存在于使用该库的电子表格中,否则您将收到错误消息。浏览器的JavaScript控制台。

  4. 在使用该库的电子表格中:工具>脚本编辑器...... 点击资源>库... 。在“包含的库”对话框中,在查找库文本框中输入独立项目的键,单击选择,然后选择相应的版本,如有必要,更改标识符,然后保存标识符值创建一个同名的对象,供电子表格的脚本用于调用库函数。就我而言,它是SignupFormResponsesSheet

  5. 在同一个脚本编辑器的代码编辑器中,添加调用库函数的包装函数,包括将从HTML对话框中调用的任何函数。我的库有onOpen(),它创建两个菜单项来显示HTML对话框,所以我添加了

  6. function onOpen() {
        SignupFormResponsesSheet.onOpen();
    }
    
    function showMappingForm() {
        SignupFormResponsesSheet.showMappingForm();
    }
    
    function showSubmitForm() {
        SignupFormResponsesSheet.showSubmitForm();
    }

    1. 我的HTML对话框有许多回调来获取和提交数据,所以我没有为每个函数编写包装函数,而是通过利用Apps Script将库视为对象的方式添加了一个函数来覆盖所有这些函数。包含功能。第一个参数是一个命名要调用的库函数的字符串。任何其他参数都将传递给库函数。
    2. function runSignupFormResponseFunction(funcName, varargs) {
        return SignupFormResponsesSheet[funcName].apply(this,
          Array.prototype.slice.call(arguments, 1));
      }

      1. 由于上面步骤3中确定的限制,HTML对话框中的JavaScript使用google.script.run在需要获取或提交数据时调用runSignupFormResponseFunction。例如,它有两个列表,这些列表使用来自库getRangeLabelsgetColumnExamples函数的服务器数据动态填充(一个必须先填充另一个),因此代码为
      2. google.script.run
          .withFailureHandler(showError)
          .withSuccessHandler(function(ranges) {
            loadRanges(ranges);
            // once ranges are loaded, load columns
            google.script.run
              .withSuccessHandler(loadColumns)
              .withFailureHandler(showError)
              .runSignupFormResponseFunction("getColumnExamples");
          })
          .runSignupFormResponseFunction("getRangeLabels");

        今天这对我有用。我希望它适用于可能会发现这个问题的其他人。