能否通过外部JavaScript修改Google Sheets实现HTML5放置游戏存档?
实现方案
完全可行,核心是用Google Apps Script搭建一个简易HTTP接口,让你的前端JavaScript能通过请求读写对应用户ID的存档数据,以下是一步步的具体实现:
1. 配置Google Sheets表格结构
- 新建Google表格,设置三列表头:
UserID(第一列)、SaveData(第二列)、LastUpdated(第三列) - 第一行留作表头,从第二行开始存储用户存档数据
2. 编写Google Apps Script接口
打开表格的「扩展程序」→「Apps Script」,替换默认代码为以下内容:
function doGet(e) { const userID = e.parameter.userID; if (!userID) return ContentService.createTextOutput(JSON.stringify({success: false, msg: '缺少用户ID'})).setMimeType(ContentService.MimeType.JSON); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); // 替换成你的表格名称 const data = sheet.getDataRange().getValues(); // 查找匹配的用户行 for (let i = 1; i < data.length; i++) { if (data[i][0] === userID) { return ContentService.createTextOutput(JSON.stringify({ success: true, saveData: JSON.parse(data[i][1]) })).setMimeType(ContentService.MimeType.JSON); } } // 未找到用户,返回空存档 return ContentService.createTextOutput(JSON.stringify({ success: true, saveData: {} })).setMimeType(ContentService.MimeType.JSON); } function doPost(e) { const payload = JSON.parse(e.postData.contents); const userID = payload.userID; const saveData = payload.saveData; if (!userID || !saveData) return ContentService.createTextOutput(JSON.stringify({success: false, msg: '参数不全'})).setMimeType(ContentService.MimeType.JSON); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); const data = sheet.getDataRange().getValues(); let foundRow = -1; // 查找用户是否已存在 for (let i = 1; i < data.length; i++) { if (data[i][0] === userID) { foundRow = i + 1; // Sheets行号从1开始计数 break; } } const now = new Date().toISOString(); const saveStr = JSON.stringify(saveData); if (foundRow !== -1) { // 更新已有用户的存档 sheet.getRange(foundRow, 2).setValue(saveStr); sheet.getRange(foundRow, 3).setValue(now); } else { // 新增用户存档行 sheet.appendRow([userID, saveStr, now]); } return ContentService.createTextOutput(JSON.stringify({success: true})).setMimeType(ContentService.MimeType.JSON); }
部署Web应用
- 点击右上角「部署」→「新部署」
- 类型选择「Web应用」
- 执行权限选「我自己」,访问权限选「任何人,甚至匿名」(仅练手用,正式环境需添加身份验证)
- 点击部署后,复制生成的Web应用URL,供前端调用
3. 前端JavaScript读写示例
在你的游戏JS文件中添加以下函数,用于处理存档的读写:
// 获取或生成用户ID并存在localStorage function getOrCreateUserID() { let userID = localStorage.getItem('game_user_id'); if (!userID) { // 生成随机用户ID,也可以使用UUID库 userID = Date.now() + '-' + Math.random().toString(36).substr(2, 9); localStorage.setItem('game_user_id', userID); } return userID; } // 读取存档 async function loadSaveData() { const userID = getOrCreateUserID(); const apiUrl = '替换成你的Web应用URL'; const response = await fetch(`${apiUrl}?userID=${encodeURIComponent(userID)}`); const result = await response.json(); if (result.success) { return result.saveData; } else { console.error('读取存档失败:', result.msg); return {}; // 返回空存档作为默认值 } } // 保存存档 async function saveSaveData(saveData) { const userID = getOrCreateUserID(); const apiUrl = '替换成你的Web应用URL'; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userID: userID, saveData: saveData }) }); const result = await response.json(); if (result.success) { console.log('存档保存成功'); } else { console.error('存档保存失败:', result.msg); } } // 用法示例 // 初始化游戏时加载存档 async function initGame() { const saveData = await loadSaveData(); // 用存档数据初始化游戏状态 // gameState.gold = saveData.gold || 0; // gameState.level = saveData.level || 1; } // 保存当前游戏状态 function saveGame() { const gameState = { gold: 1000, level: 5, items: ['sword', 'shield'] }; saveSaveData(gameState); }
注意事项
- 由于使用匿名访问,请勿存储敏感数据,仅适合练手场景
- 修改Apps Script代码后,需要重新部署并更新前端的API URL,否则会使用旧版本接口
- 若遇到CORS报错,检查Web应用的访问权限设置是否为「任何人,甚至匿名」
内容的提问来源于stack exchange,提问作者Elliot Jackson
相关产品推荐
相关产品推荐

