Я пытаюсь отобразить данные из функции сервера на боковой панели Google Sheets. Я использую асинхронный вызов сервера с обработчиком успеха, но клиент каким-то образом получает нулевое значение. Несмотря на обширный поиск связи клиент-сервер, я не смог понять, почему.
В настоящее время журнал в конце серверной функции показывает, что объект 'flags' полностью определен, но в журнале консоли в начале SuccessHandler 'showErrors' говорится, что 'flags' не определен.
Я проверил документацию Google по службе HTML и, насколько я могу судить, «флаги» являются допустимым возвращаемым значением, поскольку это объект, содержащий целые числа, строки и массив строк. Я попытался изменить «флаги» из объекта, так что это простая строка, и она все еще не определена в «showErrors». Кто-нибудь знает, почему содержимое флагов теряется между сервером и клиентом? Заранее спасибо!
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;
}
}
checkList2
? Кроме того, у вас случайно нет двух функций с именемcheckList2
? - person Joshua Dawson   schedule 31.07.2016flags
в строку перед его возвратом:flags = JSON.stringify(flags);
Затем проанализируйте строку в обработчике успеха.flags = JSON.parse(flags);
- person Alan Wells   schedule 31.07.2016checkList2
. Я попытался вернуть значение в начале функции, и оно определено на стороне клиента. Затем я попытался переместить возврат вниз по одной строке за раз, чтобы увидеть, где была ошибка. Междуvar errors=
иnErrors=
есть условиеif
, которое я пропустил выше, так как не думал, что оно уместно, но теперь оно включено выше. Возвращаемое значение определено до этогоif
и не определено после. Есть предположения? - person Tiffany G. Wilson   schedule 31.07.2016flags
, похоже, не имеет значения. Я пробовал один скаляр, одну строку, и теперьJSON.stringify()
иflags
все еще не определены в SuccessHandler. - person Tiffany G. Wilson   schedule 31.07.2016