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