Google Sheets技术问询:统计左侧工作表数或获取含最新日期的工作表
嘿,这两个需求都完全可以通过Google Apps Script实现,我来给你详细拆解两种方案:
方案一:通过统计工作表数量计算起始日期
这个方法逻辑很直接——既然你每2周复制一次模板表,那新表的数量就对应着需要增加的2周周期数。
实现思路
- 获取当前表格的所有工作表
- 过滤掉模板表(要么通过固定名称,要么通过它的位置,比如永远是第一个tab)
- 用非模板表的数量乘以14天(2周),加到模板的起始日期上
- 将计算出的新日期写入刚创建的工作表
示例代码
假设你的模板表名叫「模板」,起始日期存在模板表的A1单元格,刚复制的新表是最后一个工作表:
function setNewStartDateBySheetCount() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const templateSheet = ss.getSheetByName("模板"); // 过滤掉模板表,得到所有新建的工作表 const createdSheets = ss.getSheets().filter(sheet => sheet.getName() !== "模板"); // 获取模板的起始日期 const baseDate = templateSheet.getRange("A1").getValue(); // 计算需要增加的天数:每新增一张表加14天 const daysToAdd = createdSheets.length * 14; // 计算新的起始日期 const newStartDate = new Date(baseDate); newStartDate.setDate(newStartDate.getDate() + daysToAdd); // 将新日期写入最后一张工作表(也就是刚复制的新表)的A1单元格 const newSheet = ss.getSheets()[ss.getSheets().length - 1]; newSheet.getRange("A1").setValue(newStartDate); }
小提示
如果你的模板表永远是第一个工作表,也可以不用名称过滤,直接用const createdSheets = ss.getSheets().slice(1);来获取从第二个开始的所有工作表,这样更灵活,不用依赖模板表的名称。
方案二:获取名称含最新日期的工作表名称
如果工作表的顺序可能被打乱(比如手动调整过tab位置),那通过日期来定位最新表会更可靠。这个方法需要你的工作表名称里包含可识别的日期格式(比如2024-05-20_周报表)。
实现思路
- 获取所有非模板工作表
- 从每个工作表名称中提取日期部分
- 对比所有日期,找到最新的那个工作表
- 以最新表的起始日期为基础,加14天得到新日期
示例代码
假设工作表名称里的日期格式是YYYY-MM-DD,起始日期存在每个表的A1单元格:
function setNewStartDateByLatestSheet() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const templateName = "模板"; const sheets = ss.getSheets().filter(sheet => sheet.getName() !== templateName); let latestSheet = null; let latestDate = new Date(0); // 初始化为一个极早的日期 sheets.forEach(sheet => { const sheetName = sheet.getName(); // 用正则提取名称中的YYYY-MM-DD格式日期 const dateMatch = sheetName.match(/(\d{4}-\d{2}-\d{2})/); if (dateMatch) { const currentDate = new Date(dateMatch[1]); // 对比找到最新的日期对应的工作表 if (currentDate > latestDate) { latestDate = currentDate; latestSheet = sheet; } } }); let newStartDate; if (latestSheet) { // 如果找到最新表,就以它的起始日期加14天 const latestStartDate = latestSheet.getRange("A1").getValue(); newStartDate = new Date(latestStartDate); newStartDate.setDate(newStartDate.getDate() + 14); } else { // 如果没有找到带日期的表(比如第一次创建新表),就用模板的日期加14天 const templateSheet = ss.getSheetByName(templateName); const baseDate = templateSheet.getRange("A1").getValue(); newStartDate = new Date(baseDate); newStartDate.setDate(newStartDate.getDate() + 14); } // 将新日期写入刚复制的新表 const newSheet = ss.getSheets()[ss.getSheets().length - 1]; newSheet.getRange("A1").setValue(newStartDate); // 可选:返回最新表的名称 return latestSheet ? latestSheet.getName() : "首次创建,使用模板日期"; }
小提示
如果你的日期格式不是YYYY-MM-DD(比如2024年5月20日),需要调整正则表达式。比如匹配YYYY年MM月DD日的正则是/(\d{4}年\d{1,2}月\d{1,2}日)/,记得要确保日期能被new Date()正确解析。
两种方案都能满足你的需求,方案一更简单高效,适合工作表顺序固定的场景;方案二更健壮,适合工作表位置可能变动的情况。你可以根据自己的实际使用场景选择~
内容的提问来源于stack exchange,提问作者Bagzli
相关产品推荐
相关产品推荐

