Google Sheets 如何实现每日自动复制数值到新标签页(不含公式)
问题原因
现有代码使用duplicateActiveSheet()方法复制工作表时,会完整保留原表的所有公式,自然会出现数据同步更新的问题。你只需要在复制完成后新增一段「将新表所有内容替换为纯数值」的逻辑即可实现需求。
解决代码
function createDeleteTabs() { /* DASHBOARD--------------------------------------------------------------------------------------------------- Edit this section to change the dates tabs are created for and the range of data that will be cleared each time! */ var numberOfDaysForwardForNextTab = 0 var numberOfDaysBackwardForDeleteTab = 0 var rangeToClear = 'F5:CS' // ------------------------------------------------------------------------------------------------------------- var ss = SpreadsheetApp.getActiveSpreadsheet(); // 获取表格对象 var sourceSheet = ss.getSheets()[0]; // 提前存储原表对象,避免反复切换激活状态出错 // 计算生成/删除标签的日期 var MILLIS_PER_DAY = 1000 * 60 * 60 * 24; var today = new Date(); var addWeek = Utilities.formatDate(new Date(today.getTime() + (numberOfDaysForwardForNextTab * MILLIS_PER_DAY)), "GMT+1", "dd-MM-yy"); var deleteWeek = Utilities.formatDate(new Date(today.getTime() - (numberOfDaysBackwardForDeleteTab * MILLIS_PER_DAY)), "GMT+1", "dd-MM-yy"); // 复制原表生成新存档表 var archiveSheet = sourceSheet.copyTo(ss); // 用copyTo方法直接获取新表对象,比激活操作稳定性更高 archiveSheet.setName(addWeek); ss.setActiveSheet(archiveSheet); ss.moveActiveSheet(1); // ========== 新增逻辑:替换内容为纯数值 ========== // 获取新表全部数据范围,若仅需备份指定范围可替换为archiveSheet.getRange(rangeToClear) var dataRange = archiveSheet.getDataRange(); // 读取范围的显示值(即页面可见的最终计算结果,不包含公式) var displayValues = dataRange.getDisplayValues(); // 将纯数值写回原范围,直接覆盖原有公式 dataRange.setValues(displayValues); // 如需保留原表的单元格格式、条件格式,可新增下面一行: // dataRange.copyTo(dataRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); // ============================================== }
额外说明
- 如需调整时区可修改
Utilities.formatDate方法中的GMT+1参数,匹配你所在的时区避免日期显示错误 - 若原表包含图片、图表等特殊元素,上述方法不会影响这类元素的存档效果
内容的提问来源于stack exchange,提问作者Ben Etch
相关产品推荐
相关产品推荐

