【问题标题】:google.script.run.withSuccessHandler doesn't seem to return valuesgoogle.script.run.withSuccessHandler 似乎没有返回值
【发布时间】:2020-08-19 11:23:53
【问题描述】:

我正在尝试制作一个简单的网络应用程序,当我输入学生的 ID 号时,它会返回学生的姓名。该应用程序应调用 google 脚本函数 (searchIDReturnName),然后将其返回值传回前端的 updateName 函数。

这是我的 Apps 脚本:

var url ="https://docs.google.com/spreadsheets/d/1zGW23PVYvTsORRs0jrKNdHqb73arsRYxy22O45k60vQ/edit?usp=sharing";

function doGet(e) {
return HtmlService.createHtmlOutputFromFile("page");
}

function searchIDReturnName(idNumber)
{
  
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("StudentList");
  
  var data = ws.getRange(2,1,ws.getLastRow()-1,2).getValues();
  
  var idNumberList = data.map(function(r){return r[0];});
  var names = data.map(function(r){return r[1];}); 
  var position = idNumberList.indexOf(idNumber); 
  
  if(position > -1)
  {
  return names[position];
  }
  else
  {
  return 'No student found';
  }
  
}

这是我的 HTML:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <label> ID Number: </label> <input type = "text" id = "studentID">
    <br>
    <label id = "nameLabel" > Name: </label> <label id = "studentName"> </label> 
    
    
    
    <script> 
    document.getElementById("studentID").addEventListener("input", searchStudent); 
    
    function searchStudent()
    {
      var idNumber = document.getElementById("studentID").value; 
      if(idNumber.length === 5)
      {
        google.script.run.withSuccessHandler(updateName).searchIDReturnName(idNumber);
        document.getElementById("studentName").innerHTML = "If";
      }
      else
      {
      document.getElementById("studentName").innerHTML = "Running";
      }
    }
    
    function updateName(studentName)
    {
      document.getElementByID("studentName").innerHTML = studentName;
    }
    </script>
  </body>
</html>

我已经验证 searchIDReturnName 函数实际上在电子表格中找到了匹配的学生,它只是不会返回那个值。

【问题讨论】:

  • 它不会将该值返回给我的网络应用程序。是什么让你这么认为?
  • 为了测试这一点,我在 updateName 函数中添加了类似这样的代码:document.getElementByID("studentName").innerHTML = "I ran updateName".
  • 你的代码中有id“studentName”的元素吗?如果您的某些函数没有运行,您应该通过在每个函数中实现concole.log()(而不是附加到innerHTML)来记录重要值来进行故障排除。另外,请转到View-Executions 以发现错误。
  • 发生了什么?流程: 1.client 调用服务器函数searchIDReturnName 2. searchIDReturnName 运行并将值返回给客户端。 3.updateName 在客户端上调用 4.label id = "studentName" 更新为学生姓名。您认为以上哪一项是问题所在?最多可以使用服务器日志测试/检查第 2 步(查看> 执行将显示是否以及何时调用该函数)。可以通过在updateName 中添加console.log("I was called") 并检查浏览器上的 Chrome/Firefox>devtools>console 来测试第 3 步。
  • Apps 脚本方面的常见错误来源是,例如工作表的行数少于两行。

标签: google-apps-script google-sheets


【解决方案1】:

GS:

function searchIDReturnName(idNumber){
  var idNumber=idNumber||'10001';  
  var ss = SpreadsheetApp.getActive();
  var ws = ss.getSheetByName("Sheet1");
  var data = ws.getRange(2,1,ws.getLastRow()-1,2).getValues();
  var idNumberList = data.map(function(r){return r[0];});
  Logger.log(idNumberList);
  var names = data.map(function(r){return r[1];}); 
  Logger.log(names);
  var position = idNumberList.indexOf(idNumber); 
  Logger.log(position);
  if(position>-1) {
    Logger.log(names[position]);
    return names[position]; 
  }else{
    Logger.log('No Student Found');
    return 'No student found';
  }
}

function showMyDialog() {
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile("ah1"), "Test")
}

HTML:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <label> ID Number: </label> <input type="text" id="studentID" oninput="searchStudent();">
    <br>
    <label id="nameLabel"> Name: </label> <input type="text" id="studentName" />
    <script>         
    function searchStudent() {
      console.log('I am here');
      var idNumber = document.getElementById("studentID").value; 
      if(idNumber.length==5) {
        google.script.run.withSuccessHandler(updateName).searchIDReturnName(idNumber);
        document.getElementById("studentName").value = "If";
      }else{
      document.getElementById("studentName").value = "Running";
      }
    }
    
    function updateName(studentName){
      console.log(studentName);
      document.getElementById("studentName").value = studentName;
    }
    </script>
  </body>
</html>

【讨论】:

  • 虽然此代码 sn-p 可能是解决方案,但 including a brief explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 2019-10-22
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多