Google Apps 脚本中的成功处理程序从服务器函数接收 null

Posted

技术标签:

【中文标题】Google Apps 脚本中的成功处理程序从服务器函数接收 null【英文标题】:Success handler in Google Apps script receives null from server function 【发布时间】:2016-12-05 07:01:04 【问题描述】:

我正在尝试在 Google 表格边栏中显示来自服务器功能的数据。我正在使用成功处理程序对服务器进行异步调用,但客户端以某种方式接收到空值。尽管对客户端-服务器通信进行了大量搜索,但我仍然无法弄清楚原因。

目前,服务器函数末尾的日志显示对象'flags'完全定义,但successHandler'showErrors'开头的控制台日志显示'flags'未定义。

我查看了有关 html 服务的 Google 文档,据我所知,'flags' 是一个有效的返回值,因为它是一个包含整数、字符串和字符串数组的对象。我尝试将对象中的“标志”更改为一个简单的字符串,但它在“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;
       

【问题讨论】:

似乎应该一切正常。我认为您可能遇到的唯一问题是对 errorList 函数的调用。因此,检查将零传递给该函数是否会导致错误可能是个好主意。 @Dimu-Designs,errorList 工作得很好,事实上,第一次调用它时,参数为零,它以应有的方式返回值。我不明白如何在服务器函数的 Logger.log(flags) 中定义标志,而在客户端函数的 console.log(flags) 中未定义标志。他们不是一个接一个地执行吗? 抱歉,您必须处理这种错误。我只有几个想法:当你在checkList2 的顶部返回一些东西时会发生什么?另外,您是否有两个名为 checkList2 的函数? 在返回之前尝试将名为flags 的对象转换为字符串:flags = JSON.stringify(flags); 然后在成功处理程序中解析该字符串。 flags = JSON.parse(flags); @JoshDawson 只有一个函数checkList2。我尝试在函数的开头返回一个值,它是在客户端定义的。然后我尝试一次将返回向下移动一行,以查看错误在哪里。在var errors=nErrors= 之间有一个if 条件,我在上面省略了它,因为我认为它不相关,但它现在包含在上面。返回值在此 if 之前定义,之后未定义。有什么想法吗? 【参考方案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;

【讨论】:

谢谢!既然你这么说,那就完全有道理了。我是新手,所以我还在学习基础知识。

以上是关于Google Apps 脚本中的成功处理程序从服务器函数接收 null的主要内容,如果未能解决你的问题,请参考以下文章

python 快速和脏的脚本用于从Google Apps电子邮件下载最新的库存表并保存到服务器以进行进一步处理

Google Apps 脚本:从 AuthConfig 到 Bigquery

google Apps 脚本中的 createFile() 无法正常运行

如何从 Google Apps 脚本授权 Google Speech-to-text?

如何从 Google 电子表格中的 Google Apps 脚本自动更新“站点地图”功能?

从工作表中的 Google Apps 脚本访问 BigQuery 时需要登录错误