Google Sheets导出指定范围并追踪数值变更的脚本实现方法
Google Sheets 历史快照自动导出脚本
实现效果
完全匹配需求规则:
- 所有历史导出记录永久留存,不会被新导出的数据覆盖
- 每次新导出的快照自动紧跟上一次记录的下一列存放,列头自动标注导出的精确日期时间
- 后续导出自动向后追加列,不需要手动调整存储位置
- 每列快照完整留存导出时间点C列的全部数值,可按时间节点回溯任意版本的数据
部署步骤
- 打开目标Google表格,点击顶部「扩展程序」→「Apps Script」进入脚本编辑页面
- 删除编辑器里默认的空函数,把下方提供的完整代码粘贴进去
- 根据自己表格的实际情况修改代码开头的配置项,点击保存按钮,按弹窗提示完成谷歌账号授权即可
完整脚本代码
function exportDataSnapshot() { // ---------- 配置项,按需修改 ---------- const sourceSheetName = "源工作表"; // 替换为你存放源数据的工作表名称 const targetSheetName = "快照存储表"; // 替换为你存放历史快照的工作表名称 const dataStartRow = 2; // 源表数据起始行,第一行是表头就填2,无表头填1 // ------------------------------------ const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = activeSpreadsheet.getSheetByName(sourceSheetName); const targetSheet = activeSpreadsheet.getSheetByName(targetSheetName); // 读取源表A:C列全量有效数据 const sourceLastRow = sourceSheet.getLastRow(); const sourceData = sourceSheet.getRange(`A${dataStartRow}:C${sourceLastRow}`).getValues(); // 定位目标表本次写入的起始列 const targetLastCol = targetSheet.getLastColumn(); const writeStartCol = targetLastCol === 0 ? 1 : targetLastCol + 1; // 生成带本地时区的导出时间作为列头 const exportTime = Utilities.formatDate( new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss" ); // 组装待写入数据:首行为时间戳,后续行对应源表C列数值 const writeData = [[exportTime], ...sourceData.map(row => [row[2]])]; // 批量写入减少API调用,提升运行速度 targetSheet.getRange(1, writeStartCol, writeData.length, 1).setValues(writeData); // 导出完成弹窗提示,不需要可以注释掉下面这行 SpreadsheetApp.getUi().alert(`快照导出成功,版本时间:${exportTime}`); }
使用注意事项
- 首次部署前,请先在快照存储表的A列填入和源表顺序一致的固定标识字段(比如项目ID、名称等源表A列的固定内容),方便后续对齐各版本的数值
- 如果需要一键触发,可以在表格页面插入形状作为按钮,右键将形状指定到
exportDataSnapshot宏,后续点击按钮即可完成导出 - 脚本采用批量写入逻辑,就算数据量上千行也能秒级完成,不会出现卡顿
- 如果需要设置定时自动导出,可以在Apps Script编辑器左侧的触发器页面,给这个函数设置定时触发规则,比如每天/每周固定时间自动生成快照,不需要手动操作
内容的提问来源于stack exchange,提问作者Thierry
相关产品推荐
相关产品推荐

