Обработчик успеха в сценарии Google Apps получает нуль от серверной функции

Я пытаюсь отобразить данные из функции сервера на боковой панели 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;
  }     
}


person Tiffany G. Wilson    schedule 30.07.2016    source источник
comment
Вроде должно все работать. Я думаю, что единственное место, где у вас могут возникнуть проблемы, — это вызов функции errorList. Поэтому было бы неплохо проверить, не вызывает ли передача нуля этой функции ошибку.   -  person TheAddonDepot    schedule 31.07.2016
comment
@Dimu-Designs, errorList работает просто отлично, фактически при первом вызове аргумент равен нулю и возвращает значения так, как предполагалось. Я не понимаю, как флаги могут быть определены в Logger.log(флаги) в функции сервера и не определены в console.log(флаги) в функции на стороне клиента. Разве они не казнят одного сразу за другим?   -  person Tiffany G. Wilson    schedule 31.07.2016
comment
Извините, вам приходится иметь дело с такой ошибкой. У меня есть только несколько идей: что происходит, когда вы возвращаете что-то в верхней части checkList2? Кроме того, у вас случайно нет двух функций с именем checkList2?   -  person Joshua Dawson    schedule 31.07.2016
comment
Попробуйте преобразовать объект с именем flags в строку перед его возвратом: flags = JSON.stringify(flags); Затем проанализируйте строку в обработчике успеха. flags = JSON.parse(flags);   -  person Alan Wells    schedule 31.07.2016
comment
@JoshDawson есть только одна функция checkList2. Я попытался вернуть значение в начале функции, и оно определено на стороне клиента. Затем я попытался переместить возврат вниз по одной строке за раз, чтобы увидеть, где была ошибка. Между var errors= и nErrors= есть условие if, которое я пропустил выше, так как не думал, что оно уместно, но теперь оно включено выше. Возвращаемое значение определено до этого if и не определено после. Есть предположения?   -  person Tiffany G. Wilson    schedule 31.07.2016
comment
@SandyGood - Спасибо, но значение flags, похоже, не имеет значения. Я пробовал один скаляр, одну строку, и теперь JSON.stringify() и flags все еще не определены в SuccessHandler.   -  person Tiffany G. Wilson    schedule 31.07.2016


Ответы (1)


Вы ничего не возвращаете клиенту, если вводите этот блок if:

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;
}

Все, что вам нужно сделать, это вернуть рекурсивный вызов, и я думаю, вы получите ожидаемое поведение.

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;
}
person Joshua Dawson    schedule 31.07.2016
comment
СПАСИБО! Теперь, когда вы это говорите, это имеет полный смысл. Я новичок в этом, поэтому я все еще изучаю основы. - person Tiffany G. Wilson; 31.07.2016