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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:35:06