如何在Unity中使用Google Apps Script?doPost参数获取方法咨询
解决doPost(e)参数查看问题
直接返回e对象会得到[object Object],这是因为JavaScript对象默认的toString()方法只会输出这个标识。要查看完整的参数结构,需要将对象序列化为JSON字符串:
function doPost(e) { // 格式化输出参数,方便查看完整结构 const paramJson = JSON.stringify(e, null, 2); return ContentService.createTextOutput(paramJson) .setMimeType(ContentService.MimeType.JSON); }
部署脚本后,用Postman、curl或者Unity发送POST请求,就能看到e的完整结构,包括parameter(form-data格式参数)、postData(JSON请求体)等核心字段。
实现Unity传入ID获取谷歌表格对应行数据
步骤1:配置谷歌表格
假设你的表格第一行是表头(比如ID、Name、Score),从第二行开始是业务数据。
步骤2:编写Google Apps Script
function doPost(e) { // 解析请求参数(兼容form-data和JSON两种格式) let reqData; try { // 优先解析JSON请求体(Unity推荐使用这种方式) reqData = JSON.parse(e.postData.contents); } catch (err) { // 解析失败时 fallback 到form-data格式参数 reqData = e.parameter; } // 校验ID参数是否存在 const targetId = reqData.id; if (!targetId) { return ContentService.createTextOutput(JSON.stringify({ success: false, msg: "缺少ID参数" })).setMimeType(ContentService.MimeType.JSON); } // 打开目标表格(替换成你的表格ID和工作表名称) const sheet = SpreadsheetApp.openById("你的表格ID").getSheetByName("Sheet1"); const allData = sheet.getDataRange().getValues(); const header = allData[0]; const dataRows = allData.slice(1); // 跳过表头行 // 查找对应ID的行数据 let resultRow = null; for (const row of dataRows) { // 转字符串避免数字/字符串类型不匹配问题,假设ID在第一列(索引0) if (row[0].toString() === targetId.toString()) { // 将行数据转为键值对格式,方便Unity解析 resultRow = {}; for (let i = 0; i < header.length; i++) { resultRow[header[i]] = row[i]; } break; } } // 返回处理结果 if (resultRow) { return ContentService.createTextOutput(JSON.stringify({ success: true, data: resultRow })).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput(JSON.stringify({ success: false, msg: "未找到ID对应的行数据" })).setMimeType(ContentService.MimeType.JSON); } }
步骤3:部署为Web应用
- 在脚本编辑器点击「部署」→「新部署」
- 类型选择「Web应用」
- 执行权限选「我」,访问权限选「任何人,甚至匿名」(若需安全验证,可后续添加自定义密钥校验)
- 点击部署,复制生成的Web应用URL
步骤4:Unity端调用示例
用UnityWebRequest发送JSON格式请求:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class SheetDataFetcher : MonoBehaviour { [SerializeField] private string webAppUrl = "你的Web应用URL"; // 外部调用此方法传入ID获取数据 public IEnumerator GetDataByID(string targetID) { // 构造请求数据 var requestPayload = new { id = targetID }; string jsonPayload = JsonUtility.ToJson(requestPayload); using (UnityWebRequest request = UnityWebRequest.Post(webAppUrl, "")) { byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonPayload); request.uploadHandler = new UploadHandlerRaw(jsonBytes); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求失败: {request.error}"); } else { string responseJson = request.downloadHandler.text; Debug.Log($"响应数据: {responseJson}"); // 解析响应到自定义序列化类 SheetResponse response = JsonUtility.FromJson<SheetResponse>(responseJson); if (response.success) { Debug.Log($"获取到数据: ID={response.data.ID}, Name={response.data.Name}, Score={response.data.Score}"); } else { Debug.LogError($"错误信息: {response.msg}"); } } } } // 对应响应JSON结构的序列化类 [System.Serializable] private class SheetResponse { public bool success; public string msg; public SheetRowData data; } [System.Serializable] private class SheetRowData { public string ID; public string Name; public int Score; // 根据你的表格字段添加对应属性 } }
注意事项
- 确保谷歌表格已设置共享权限,允许脚本访问(可设置为「知道链接的任何人可查看」)
- 修改脚本后需重新部署Web应用,否则调用的仍是旧版本代码
- 若需更高安全性,可在请求中添加自定义密钥,在脚本中校验密钥合法性
内容的提问来源于stack exchange,提问作者RpDev
相关产品推荐
相关产品推荐

