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

因数据过大自带功能失效,如何用App Script查看Google Sheets特定页面编辑历史

用Google Apps Script实现特定工作表的编辑历史查看工具

当然可以通过Google Apps Script实现特定工作表的编辑历史查询,避开全表加载导致的性能问题。以下是具体实现方案:

核心脚本实现

该脚本通过Drive API获取文件版本历史,对比不同版本间目标工作表的内容差异,最终将编辑记录输出到新工作表中。

function getSpecificSheetEditHistory() {
  const targetSheetName = "目标工作表名称"; // 替换为你需要查询的工作表名称
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName(targetSheetName);
  
  if (!targetSheet) {
    SpreadsheetApp.getUi().alert("未找到指定的工作表");
    return;
  }

  // 获取当前表格的文件ID及版本历史
  const fileId = ss.getId();
  const versions = Drive.Files.list({
    fileId: fileId,
    fields: "versions(id, modifiedDate, lastModifyingUser, versionNumber)",
    maxResults: 50 // 可根据需求调整获取的版本数量,避免运行超时
  }).versions;

  // 创建或复用存储历史记录的工作表
  let resultSheet = ss.getSheetByName("编辑历史记录");
  if (!resultSheet) {
    resultSheet = ss.insertSheet("编辑历史记录");
    resultSheet.appendRow(["版本号", "修改时间", "修改人", "修改内容"]);
  } else {
    // 清空旧记录(保留表头)
    resultSheet.getRange(2, 1, resultSheet.getLastRow() - 1, 4).clearContent();
  }

  // 遍历版本,对比目标工作表的内容差异
  for (let i = versions.length - 1; i > 0; i--) {
    const currentVersion = versions[i];
    const prevVersion = versions[i - 1];

    // 获取两个版本的表格文件
    const currentFile = Drive.Files.get(fileId, { alt: 'media', version: currentVersion.versionNumber });
    const prevFile = Drive.Files.get(fileId, { alt: 'media', version: prevVersion.versionNumber });

    // 解析为Spreadsheet对象
    const currentSs = SpreadsheetApp.openByUrl(currentFile.exportLinks['application/vnd.google-apps.spreadsheet']);
    const prevSs = SpreadsheetApp.openByUrl(prevFile.exportLinks['application/vnd.google-apps.spreadsheet']);

    const currentSheet = currentSs.getSheetByName(targetSheetName);
    const prevSheet = prevSs.getSheetByName(targetSheetName);

    if (!currentSheet || !prevSheet) continue;

    // 获取工作表数据范围
    const currentData = currentSheet.getDataRange().getValues();
    const prevData = prevSheet.getDataRange().getValues();

    // 对比单元格内容差异
    const changes = [];
    const maxRows = Math.max(currentData.length, prevData.length);
    for (let row = 0; row < maxRows; row++) {
      const currentRow = currentData[row] || [];
      const prevRow = prevData[row] || [];
      const maxCols = Math.max(currentRow.length, prevRow.length);

      for (let col = 0; col < maxCols; col++) {
        const currentVal = currentRow[col] || "";
        const prevVal = prevRow[col] || "";

        if (currentVal !== prevVal) {
          const cellAddress = SpreadsheetApp.newRange(row + 1, col + 1).getA1Notation();
          changes.push(`${cellAddress}: 从"${prevVal}"改为"${currentVal}"`);
        }
      }
    }

    // 将差异记录写入结果表
    if (changes.length > 0) {
      resultSheet.appendRow([
        currentVersion.versionNumber,
        new Date(currentVersion.modifiedDate).toLocaleString(),
        currentVersion.lastModifyingUser.displayName,
        changes.join("\n")
      ]);
    }
  }

  SpreadsheetApp.getUi().alert("编辑历史已生成,请查看「编辑历史记录」工作表");
}

使用步骤

  1. 打开目标Google Sheets,点击「扩展程序」→「Apps Script」进入脚本编辑器
  2. 粘贴上述代码,将targetSheetName替换为你需要查询的工作表名称
  3. 点击左侧「服务」按钮(加号图标),搜索并启用Drive API
  4. 保存脚本,运行getSpecificSheetEditHistory函数,首次运行需完成权限授权
  5. 运行完成后,表格会生成「编辑历史记录」工作表,展示指定页面的所有修改细节

注意事项

  • 版本数量maxResults建议按需调整,过大可能导致脚本运行超时
  • 若目标工作表数据量极巨,可添加行/列范围限制(比如只对比A1:Z1000区间)来提升性能
  • 每次运行脚本会清空「编辑历史记录」的旧数据(保留表头),如需保留历史可修改代码逻辑
  • 授权时需允许脚本访问你的Drive文件及Sheets数据,这是正常权限需求

内容的提问来源于stack exchange,提问作者Pius Fernandes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:10:44