开发者问题收集

Google 应用脚本函数在 html 中返回未定义

2017-05-19
2281

我正在为 Google Docs 构建一个插件(仅用于练习),其作用类似于电子邮件。我已经整合了发送、接收、删除和查看消息的功能。我添加了 UI 模式对话框所需的代码,但其中一个函数仅返回 undfined 。我在 code.gs 文件中测试了此功能,它运行完美。以下是 code.gs 的一部分:

function onInstall() {
  var html = HtmlService.createHtmlOutputFromFile('Startup').setWidth(350).setHeight(170);
  DocumentApp.getUi().showModalDialog(html, 'New account:');
}

function testCheck() {
  var ui = DocumentApp.getUi();
  ui.alert(checkUsername(ui.prompt('').getResponseText(), ui.prompt('').getResponseText()));
}

function checkUsername(un, em) {
  var i; var a; var is;
  var props = PropertiesService.getScriptProperties();
  if (props.getProperty(un) == null) {
    is = true;
  } else {
    return 'This username is taken!';
  }
  if (em.length == 0) {
    return true;
  } else {
    var len = (em.match(/@/g) || []).length;
    if (len == 1) {
      if (props.getProperty(em) != null) {
        return 'Someone has already registered this email address as ' + props.getProperty(em);
      } else {
        return true;
      }
    } else {
      if (em.indexOf(', ') != -1) {
        em = em.split(', ');
      } else if (em.indexOf('; ') != -1) {
        em = em.split('; ');
      } else if (em.indexOf(' + ') != -1) {
        em = em.split(' + ');
      } else if (em.indexOf(';') != -1) {
        em = em.split(';');
      } else if (em.indexOf(',') != -1) {
        em = em.split(',');
      } else if (em.indexOf('+') != -1) {
        em = em.split('+');
      } else if (em.indexOf(' ') != -1) {
        em = em.split(' ');
      } else {
        return 'Please separate your email addresses with a comma, space, or semicolon.';
      }
      for (i = 0; i < em.length; i++) {
        a = em[i];
        if (props.getProperty(a) != null) {
          return 'Someone has already registered ' + a + ' as ' + props.getProperty(a);
        }
      }
      return true;
    }
  }
}

以下是 html 文件:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
    Username:<br>
    <input type='text' id='user' style='width:350px' maxlength='12'/><br>
    Other email addresses:<br>
    <textarea id='extras' style='width:350px' rows='2'></textarea><br>
    <span class='error' id='err'></span><br>
    <button class='action' onClick='check()'>Next</button>
    <button onclick='group()'>Groups</button><br>
    <script>
      function check() {
        var un = document.getElementById('user').value;
        var em = document.getElementById('extras').value;
        var fail = document.getElementById('err');
        var is = google.script.run.checkUsername(un, em);
        if (typeof is == 'string') {
          fail.innerHTML = is;
        } else {
          google.script.host.close();
          google.script.run.setAccount(un, em);
        }
      }

      function group() {
        var un = document.getElementById('user').value;
        var em = document.getElementById('extras').value;
        var is = google.script.run.checkUsername(un, em);
        if (typeof is == 'boolean') {
          setGroupAddress(un, em);
        } else {
          document.getElementById('err').innerHtml = is;
        }
      }
    </script>
  </body>
</html>

更新: 我完全重新输入了这些函数,但程序继续返回未定义。所有输入都是正确的值,并且该函数在 ui.alert() 框中正确返回信息。

2个回答

在完整阅读 Google Apps Script 文档后,我终于搞明白了。 google.script.run.function() API 不返回值 。为了从脚本中获取数据,您必须让脚本生成原始 HTML,并创建一个带有 HTML 字符串的对话框。

Radvylf Programs
2018-04-03

出于安全考虑,脚本无法直接将 HTML 返回浏览器。相反,脚本必须对其进行清理,以使其无法执行恶意操作。您可以使用 createHtmlOutput API 返回已清理的 HTML

function doGet() {
  return HtmlService.createHtmlOutput('<b>Hello, world!</b>');
}

HtmlOutput 中的代码可以包含嵌入式 JavaScript 和 CSS。(这是操作 DOM 的标准客户端 JavaScript,而不是 Apps 脚本)。所有这些内容均使用 Google Caja 进行清理,这会对您的客户端代码施加一些限制。有关更多信息,请参阅 HTML 服务中的限制指南。

https://developers.google.com/apps-script/reference/html/html-output#

Dev Venture
2019-09-29