繁体   English   中英

来自库的 Google Script HTML 表单抛出错误未捕获

[英]Google Script HTML form from Library throws error Uncaught

我有一个像这样的 HTML 格式的库:

code.gs

function openDialog() {
  SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("h"), "Test" );
}

function hello() {
  console.log('booo');
}

h.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     <button id="b">Click me</button> 
    <script> 
    var b = document.getElementById('b');
    b.onclick = function() {
      google.script.run
      .withSuccessHandler(function(str){window.alert("executed");})
      // .withFailureHandler(function(error){window.alert("failed");})
      .hello();
    }
    </script>
  </body>
</html>

我共享了这个脚本以供查看并将其部署为库。 接下来,我使用以下代码在 Google Sheet 中创建了一个绑定脚本:

function onOpen() {
  SpreadsheetApp.getUi().createMenu('test').addItem('run', 'myFunction').addToUi();
}

var hello = function() {};
function myFunction() {
  TT.openDialog();
}

我添加了带有标识符的库:TT。

接下来,我使用绑定代码刷新了我的 Google 表格文件以查看菜单“测试”,运行测试 > 运行。 HTML 窗口出现了。 当我点击按钮时,什么也没发生。 当我打开控制台时,我看到了错误:

在此处输入图像描述

如果我不使用库,则不会出现此错误。

请帮我解决这个问题。

我和你经历过同样的情况。 就我而言,问题的原因是图书馆方面的授权。

  • 当使用库中范围的授权过程没有在库端完成时,我确认发生了Uncaught的错误。
  • 当在库端完成使用库中范围的授权过程时,我确认没有出现Uncaught的错误。

也就是说,在我的环境中,我确认当库用于您的情况时,需要为客户端和库端授权范围。

因此,作为一种解决方法,我使用了以下流程。

解决方法:

  1. 创建一个 Google Apps 脚本库。
    • 请将您的code.gsh.html脚本复制并粘贴到独立脚本或容器绑定脚本。
  2. 将 Google Apps 脚本部署为库。
  3. 例如,在您的脚本中,请直接在库端运行hello()并授权范围。
  4. 将库安装到客户端并从客户端加载库。
  5. 请在客户端运行myFunction()

通过此流程,当您在自定义菜单上运行run并单击按钮时,将打开executed对话框。

笔记:

  • 在这种情况下,当我想让用户使用客户端脚本时,需要对客户端和库端的范围进行授权。 我想这可能有点不方便。
  • 那么,如何为 Google 问题跟踪器报告此问题? Ref不幸的是,我找不到具有相同情况的问题跟踪器。

添加:

作为从客户端授权库端范围的方法,我想建议使用 Web 应用程序。 我以为在使用Web Apps时,库端的授权可以在客户端完成。 至此,我认为不便之处可能会得到一点解决。

请执行以下流程。

1.图书馆方面。

请复制并粘贴以下脚本。

Google Apps 脚本: code.gs

function openDialog() {
  SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("h"), "Test" );
}

function hello() {
  console.log('booo');
}

function doGet() {
  return HtmlService.createHtmlOutput("ok");
}

HTML: h.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
     <button id="b">Click me</button> 
    <script> 
    var b = document.getElementById('b');
    b.onclick = function() {
      google.script.run
      .withSuccessHandler(function(str){window.alert("executed");})
      // .withFailureHandler(function(error){window.alert("failed");})
      .hello();
    }
    </script>
  </body>
</html>

2、在库端部署Web Apps。

请在库侧部署 Web 应用程序。 关于这个方法,可以看官方文档。 参考详细设置如下。

  • Execute as: User accessing the web app
  • Who has access: Anyone with Google account

3. 部署为库。

请部署为库。 参考

4.客户端。

请将库安装到客户端。 并且,请复制并粘贴以下脚本。 在这种情况下,请将https://script.google.com/macros/s/###/exec替换为您的 Web 应用程序 URL。

function onOpen() {
  SpreadsheetApp.getUi().createMenu('test').addItem('auth', 'auth').addItem('run', 'myFunction').addToUi();
}

var hello = function() {};
function myFunction() {
  TT.openDialog();
}

function auth() {
  const html = HtmlService.createHtmlOutput(`<input type="button" value="Authorize" onclick="window.open('https://script.google.com/macros/s/###/exec', '_blank');google.script.host.close()">`);
  SpreadsheetApp.getUi().showDialog(html);
}

5. 测试。

首先,请在自定义菜单中运行auth 这样,您可以授权客户端和库端的范围。 如果运行auth时没有打开新选项卡,请在脚本编辑器中再次运行auth()

作为下一步,请运行run 这样,您的对话框就打开了。 并且,当两个auth (客户端和库端)都已经完成时,当您单击按钮时,将打开executed对话框。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM