You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:03:14