Google Apps 脚本中的成功处理程序从服务器函数接收到 null
Success handler in Google Apps script receives null from server function
我正在尝试在 Google 表格侧边栏中显示来自服务器功能的数据。我正在使用成功处理程序对服务器进行异步调用,但客户端以某种方式收到空值。尽管对客户端-服务器通信进行了广泛搜索,但我仍无法弄清楚原因。
目前,服务器函数末尾的日志显示对象 'flags' 已完全定义,但 successHandler 'showErrors' 开头的控制台日志显示 'flags' 是不明确的。
我查看了关于 HTML 服务的 Google 文档,据我所知 'flags' 是一个有效的 return 值,因为它是一个包含整数、字符串和字符串数组。我尝试将 'flags' 从一个对象更改为一个简单的字符串,但它在 'showErrors.' 中仍然未定义 有谁知道为什么 'flags' 的内容在服务器和服务器之间丢失客户? 提前致谢!
HTML:
<form onsubmit="google.script.host.close()">
<div id="intro" style="font-style:italic">
<p><b>Title</b><br><br>
Introduction text</p>
<HR>
<input type="button" style="button" id="start" value="Start" onclick="hideDiv('intro');google.script.run.withSuccessHandler(showErrors).checkList2(0,0)"> <!-- Intro starts loop -->
</div>
<div id="showErrors"></div>
</form>
<script>
function showErrors(flags){
console.log('client side flags:');
console.log(flags);
var div = document.getElementById('showErrors');
div.innerHTML = '<p style="font-style:italic">';
div.innerHTML += 'Sheet '+flags.pageNum+' of '+flags.numPages+'.';
//... more div.innerHTML += ...
div.innerHTML += '<input type="button" style="button" value="Next" onclick="google.script.run.withSuccessHandler(showErrors).checkList2('+Number(flags.pageNum)+1+','+flags.totalErrors+')"';
div.innerHTML += '<input type="submit" style="button" value="Cancel">';
}
function hideDiv(div){
document.getElementById(div).innerHTML=''; // clear div
}
</script>
服务器函数:
function checkList2(nComplete,nErrors){
var nSheets=21;
nComplete = Number(nComplete);
nErrors = Number(nErrors);
var results = errorList(nComplete); // Get results.name (string) and results.errors (array)
var errors = results.errors;
if (errors=='') {
checkList2(nComplete+1,nErrors); // Move on to next sheet
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}
}
如果您输入此 if
块,您不会 return 向客户提供任何信息:
if (errors=='') {
checkList2(nComplete+1,nErrors); // Move on to next sheet
// no return
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}
您需要做的就是 return 递归调用,我认为您会得到预期的行为。
if (errors=='') {
return checkList2(nComplete+1,nErrors); // Move on to next sheet
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}
我正在尝试在 Google 表格侧边栏中显示来自服务器功能的数据。我正在使用成功处理程序对服务器进行异步调用,但客户端以某种方式收到空值。尽管对客户端-服务器通信进行了广泛搜索,但我仍无法弄清楚原因。
目前,服务器函数末尾的日志显示对象 'flags' 已完全定义,但 successHandler 'showErrors' 开头的控制台日志显示 'flags' 是不明确的。
我查看了关于 HTML 服务的 Google 文档,据我所知 'flags' 是一个有效的 return 值,因为它是一个包含整数、字符串和字符串数组。我尝试将 'flags' 从一个对象更改为一个简单的字符串,但它在 'showErrors.' 中仍然未定义 有谁知道为什么 'flags' 的内容在服务器和服务器之间丢失客户? 提前致谢!
HTML:
<form onsubmit="google.script.host.close()">
<div id="intro" style="font-style:italic">
<p><b>Title</b><br><br>
Introduction text</p>
<HR>
<input type="button" style="button" id="start" value="Start" onclick="hideDiv('intro');google.script.run.withSuccessHandler(showErrors).checkList2(0,0)"> <!-- Intro starts loop -->
</div>
<div id="showErrors"></div>
</form>
<script>
function showErrors(flags){
console.log('client side flags:');
console.log(flags);
var div = document.getElementById('showErrors');
div.innerHTML = '<p style="font-style:italic">';
div.innerHTML += 'Sheet '+flags.pageNum+' of '+flags.numPages+'.';
//... more div.innerHTML += ...
div.innerHTML += '<input type="button" style="button" value="Next" onclick="google.script.run.withSuccessHandler(showErrors).checkList2('+Number(flags.pageNum)+1+','+flags.totalErrors+')"';
div.innerHTML += '<input type="submit" style="button" value="Cancel">';
}
function hideDiv(div){
document.getElementById(div).innerHTML=''; // clear div
}
</script>
服务器函数:
function checkList2(nComplete,nErrors){
var nSheets=21;
nComplete = Number(nComplete);
nErrors = Number(nErrors);
var results = errorList(nComplete); // Get results.name (string) and results.errors (array)
var errors = results.errors;
if (errors=='') {
checkList2(nComplete+1,nErrors); // Move on to next sheet
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}
}
如果您输入此 if
块,您不会 return 向客户提供任何信息:
if (errors=='') {
checkList2(nComplete+1,nErrors); // Move on to next sheet
// no return
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}
您需要做的就是 return 递归调用,我认为您会得到预期的行为。
if (errors=='') {
return checkList2(nComplete+1,nErrors); // Move on to next sheet
} else {
nErrors = nErrors + errors.length;
var flags = {};
flags.numErrors = errors.length;
flags.totalErrors = nErrors;
flags.pageNum = nComplete;
flags.numPages = nSheets;
flags.sheetName = results.name;
flags.errors = errors;
Logger.log('server side flags:')
Logger.log(flags)
return flags;
}