谷歌表格脚本修改需求:覆盖重复周数据并保留最近14周数据
修改Google Apps Script实现周数据同步与清理
需求说明
需要将Source表的最新数据同步到Destination表,规则如下:
- 每周Source表会上传最近两周的数据,同步时覆盖Destination表中同周的旧数据
- Destination表仅保留最近14周的数据,自动删除更早的记录
修改后的脚本
function SyncWeeklyData() { // 定义表格ID和表名 const SPREADSHEET_ID = '1BQb-_572SbReJWcD8nhfWFj8u4D15jhg7NtrsBT2vz4'; const SOURCE_SHEET_NAME = 'Source'; const DESTINATION_SHEET_NAME = 'Destination'; // 获取源表和目标表 const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID); const sourceSheet = spreadsheet.getSheetByName(SOURCE_SHEET_NAME); const destinationSheet = spreadsheet.getSheetByName(DESTINATION_SHEET_NAME); // 读取源表数据(包含表头) const sourceData = sourceSheet.getDataRange().getValues(); const [sourceHeader, ...sourceRows] = sourceData; // 读取目标表现有数据(包含表头) const destinationData = destinationSheet.getDataRange().getValues(); const [destinationHeader, ...destinationRows] = destinationData; // 用Map存储周数对应的完整数据,源表数据自动覆盖同周旧数据 // 假设周数在第1列(索引0),若实际位置不同,修改此处索引 const weekDataMap = new Map(); // 先导入目标表现有数据 destinationRows.forEach(row => { const weekNumber = row[0]; weekDataMap.set(weekNumber, row); }); // 导入源表数据,覆盖同周旧数据 sourceRows.forEach(row => { const weekNumber = row[0]; weekDataMap.set(weekNumber, row); }); // 提取所有周数,转数字后降序排序 const sortedWeeks = Array.from(weekDataMap.keys()) .map(week => Number(week)) .sort((a, b) => b - a); // 保留最近14周的数据 const keepWeeks = sortedWeeks.slice(0, 14); // 筛选出需要保留的行数据,按周数降序排列 const finalRows = keepWeeks.map(week => weekDataMap.get(week.toString())); // 清空目标表内容(保留表头) destinationSheet.clearContents(); destinationSheet.getRange(1, 1, 1, destinationHeader.length).setValues([destinationHeader]); // 将筛选后的数据写入目标表 if (finalRows.length > 0) { destinationSheet.getRange(2, 1, finalRows.length, finalRows[0].length).setValues(finalRows); } }
关键逻辑说明
- 数据覆盖机制:通过
Map结构存储周数与行数据的映射,先导入目标表旧数据,再导入源表数据,自动完成同周数据的覆盖 - 周数筛选:提取所有周数并降序排序,截取前14条即为最近14周的有效数据
- 目标表更新:清空目标表原有内容(保留表头)后写入筛选后的最新数据,避免重复数据堆积
注意事项
- 确保周数列格式统一(如均为数字格式的"45""46"),否则会导致匹配失败
- 若周数不在第1列,修改脚本中
row[0]的索引值(比如周数在第3列则改为row[2]) - 首次运行前建议备份Destination表数据,避免意外丢失
内容的提问来源于stack exchange,提问作者AnnalystA
相关产品推荐
相关产品推荐

