Google App Script运行后重定向至Google表单的实现方法
实现Google App Script位置采集完成后跳转回表单的配置方法
你现有绑定Google表单的位置采集脚本已经能正常写入表格数据,只需要补全前后端的回调逻辑,就能跳过Google默认的非官方应用提示页,实现自动跳转回表单或者展示自定义提交完成页,不需要改动核心的地理位置采集逻辑。
方案一:采集完成自动跳转回空白表单页
1. 调整Code.gs(注意你原文件名拼写为Gode.GS,要和doGet引用的文件名匹配,建议统一改为标准的Code.gs)
在现有getLoc函数的对应分支末尾,增加表单地址返回值,修改后的完整代码如下:
function doGet() { return HtmlService.createHtmlOutputFromFile("Index"); } function getLoc(value) { var destId = FormApp.getActiveForm().getDestinationId() ; var ss = SpreadsheetApp.openById(destId) ; var respSheet = ss.getSheets()[0] ; var data = respSheet.getDataRange().getValues() ; var headers = data[0] ; var numColumns = headers.length ; var numResponses = data.length; var c=value[0]; var d=value[1]; var e=c + "," + d ; if (respSheet.getRange(1, numColumns).getValue()=="GeoAddress") { respSheet.getRange(numResponses,numColumns-2).setValue(Utilities.formatDate(new Date(), "GMT+2", "dd/MM/yyyy HH:mm:ss")); respSheet.getRange(numResponses,numColumns-1).setValue(e); var response = Maps.newGeocoder().reverseGeocode(value[0], value[1]); f= response.results[0].formatted_address; respSheet.getRange(numResponses,numColumns).setValue(f); // 返回当前表单的公开提交地址 return FormApp.getActiveForm().getPublishedUrl() + "/viewform"; } else if (respSheet.getRange(1,numColumns).getValue()!="GeoAddress") { respSheet.getRange(1,numColumns+1).setValue("GeoStamp"); respSheet.getRange(1,numColumns+2).setValue("GeoCode"); respSheet.getRange(1,numColumns+3).setValue("GeoAddress"); // 首次初始化表头时返回标记,前端刷新页面即可 return "init"; } }
2. 替换Index.html全部代码
原代码缺少标签闭合、没有回调逻辑,替换为以下内容,增加加载提示、错误处理和自动跳转逻辑:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>信息提交中</title> <style> .container{width: 100%; text-align: center; margin-top: 120px; font-family: Arial, sans-serif;} .tip{font-size: 18px; color: #333;} </style> </head> <body> <div class="container"> <p class="tip" id="status">正在获取地理位置,请勿关闭页面...</p> </div> <script> // 页面加载即请求位置权限 (function init(){ if(!navigator.geolocation){ document.getElementById("status").innerText = "当前浏览器不支持位置获取,请返回表单重新操作"; return } navigator.geolocation.getCurrentPosition(successCallback, errorCallback); })() // 位置获取失败提示 function errorCallback(){ document.getElementById("status").innerText = "位置获取失败,请检查浏览器位置权限后返回表单重试"; } // 位置获取成功后调用后端接口写入数据 function successCallback(position){ const lat = position.coords.latitude; const lng = position.coords.longitude; google.script.run .withSuccessHandler(function(res){ if(res === "init"){ // 首次初始化表头,刷新页面重新执行 window.location.reload(); return } document.getElementById("status").innerText = "提交成功,正在返回表单页面..."; // 延迟1秒跳转,给用户反应时间 setTimeout(()=>{ window.top.location.href = res; }, 1000) }) .getLoc([lat, lng]) } </script> </body> </html>
重新部署脚本后,位置数据写入完成就会自动跳转到空白的表单提交页,用户可以直接填写下一份响应,不会停留在Google的默认提示页。
方案二:展示自定义完成页,提供手动跳转入口
如果不需要强制自动跳转,可以保留方案一的Code.gs代码不变,只修改Index.html里withSuccessHandler的回调逻辑,写入自定义页面内容即可:
.withSuccessHandler(function(res){ if(res === "init"){ window.location.reload(); return } // 渲染自定义完成页 document.body.innerHTML = ` <div class="container"> <p style="font-size: 22px; color: #1e8e3e;">✅ 提交成功</p> <p style="color: #666; margin: 16px 0;">您的问卷回答和地理位置信息已同步记录</p> <a href="${res}" style="display: inline-block; padding: 10px 24px; background: #1a73e8; color: #fff; border-radius: 4px; text-decoration: none; margin-top: 20px;">提交另一份响应</a> </div> ` })
这种方式会完全覆盖Google默认的提示页面,用户看到的是你自定义的提示内容和跳转按钮,点击按钮即可回到表单页。
部署注意事项
- 重新部署Web应用时,执行身份选择「我本人」,访问权限选择「任何拥有链接的人」,避免受访者打开页面时触发授权提示。
- 跳转使用
window.top.location.href是为了突破iframe嵌套限制,避免只在小框架内跳转。 - 脚本会自动识别表头是否初始化,第一次运行时会自动添加地理位置相关的三列表头,不需要手动在表格里提前加列。
内容的提问来源于stack exchange,提问作者Gerrit Venter
相关产品推荐
相关产品推荐

