Google Apps Script调用Code.gs函数返回undefined问题排查
问题根因
返回undefined是因为你对google.script.run的用法有误:这个API是前端和Code.gs后端通信的异步接口,调用后不会直接同步返回后端函数的执行结果,你直接把调用表达式赋值给输入框,拿到的只能是undefined。
修复方法
Code.gs里的业务逻辑本身没有问题,只需要调整前端Index.html里的调用逻辑,通过withSuccessHandler注册执行成功的回调,在回调里接收后端返回值再赋值给结果框即可。
修正后的前端脚本逻辑
把原来的processData函数替换成下面的写法:
function processData() { var lastName = document.getElementById("txtLastName").value; var firstName = document.getElementById("txtFirstName").value; google.script.run // 后端执行成功后,会把返回值传入这个回调函数 .withSuccessHandler(function(returnedTxt) { document.getElementById("txtResult").value = returnedTxt; }) // 可选:加错误捕获,后端执行报错时能看到错误信息,后续对接Sheets调试很有用 .withFailureHandler(function(error) { alert("处理失败:" + error.message); }) .getData(lastName, firstName); }
完整验证通过的代码
Code.gs(原有逻辑无需改动)
function doGet(e) { return HtmlService.createTemplateFromFile('Index').evaluate(); } function getData(a, b){ var lastName = a; var firstName = b; var txtResult = "Hello " + lastName + ", " + firstName; return txtResult; }
Index.html
<!DOCTYPE html> <html> <body> <div> <label>Enter Last Name</label> <input type="text" id="txtLastName"/></br> <label>Enter First Name</label> <input type="text" id="txtFirstName"/></br> <button id="btnProcess">Process</button></br> <input type="text" id="txtResult"/> </div> </body> <script> document.getElementById("btnProcess").addEventListener("click", processData); function processData() { var lastName = document.getElementById("txtLastName").value; var firstName = document.getElementById("txtFirstName").value; google.script.run .withSuccessHandler(function(res) { document.getElementById("txtResult").value = res; }) .withFailureHandler(function(err) { console.error(err); }) .getData(lastName, firstName); } </script> </html>
注意点
- 所有通过
google.script.run调用后端Code.gs函数的场景,都必须通过withSuccessHandler拿返回值,不存在同步获取返回值的写法 - 前端传给后端的参数只能是基础类型、普通可序列化的对象/数组,不能传DOM节点、函数这类无法序列化的内容,你现在传两个字符串参数是完全符合要求的
内容的提问来源于stack exchange,提问作者rmbelmonte
相关产品推荐
相关产品推荐

