Docs-从该库中的html调用库函数

问题描述 投票:0回答:1

为了与同事共享我正在开发的AppsScript代码,我在Google文档模板中创建了一个用作库的独立项目。

此库包含:

  • 服务器端代码的.gs文件
  • 客户端侧栏的.html文件

在边栏中,有一个按钮触发带有参数的库中的函数调用。

JavaScript调用如下:

        google.script.run
            .withFailureHandler(
              function(msg, element) {
                showError(msg, $('#button-bar'));
              })
            .test();

我在其他页面上读到未公开库代码,因此测试功能实际上在我的文档的AppsScript代码中,并调用了等效的库函数。如此处建议的:Can a Google Spreadsheet Apps Script library contain a user dialog?

Docs AppsScript中的代码:

function test()
{
  myLibrary.test();
}

myLibrary库中的代码:

function test()
{
  DocumentApp.getUi().alert('test');
}

问题是来自javascript的故障处理程序返回ScriptError,表明我需要获得执行此操作的授权。

关于我在做什么错的任何想法?

PS:我知道我可以添加一个插件,但这不是我可以轻松地在公司内部完成的事情:)

google-apps-script google-docs
1个回答
0
投票

是的,当您使用库中的html代码(侧边栏)时,它将在绑定到文档的脚本内调用test()函数,而不是库中的那个。

您需要请求用户许可才能提示UI元素,您可以使用自定义菜单[1]进行操作。

此外,用户至少需要具有对库的读取访问权限[2]。我添加了withSuccessHandler函数[3],以在边栏中显示客户端的响应。以下代码为我工作:

绑定到文档的脚本:

function onOpen() {
  DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .createMenu('Custom Menu')
      .addItem('Show sidebar', 'showSidebar')
      .addToUi();
}

function showSidebar() {
  myLibrary.showSidebarLibrary();
}

//
function test() {
  myLibrary.test();
}

图书馆:

code.gs

function showSidebarLibrary() {
  var html = HtmlService.createHtmlOutputFromFile('Page')
      .setTitle('My custom sidebar')
      .setWidth(300);
  DocumentApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
      .showSidebar(html);
}

function test() {
  DocumentApp.getUi().alert('test');
  return "Success";
}

Page.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    Hello, world!<br>
    <input type="button" value="Alert" onclick="alert()" /><br>
    <input type="button" value="Close" onclick="google.script.host.close()" />
    <p id="msg">Replace message with response<p>
    </body>
    <script>
        function alert() {
            google.script.run.withFailureHandler(handler).withSuccessHandler(handler).test();
        }
        function handler(msg) {
            document.getElementById("msg").innerHTML = msg;
        }
  </script>
</html>

[1] https://developers.google.com/apps-script/guides/menus

[2] https://developers.google.com/apps-script/guides/libraries#gaining_access_to_a_library_and_including_it_in_your_project

[3] https://developers.google.com/apps-script/guides/html/communication#success_handlers

© www.soinside.com 2019 - 2024. All rights reserved.