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

Google Sheets 如何根据起止日期在新列提取中间日期列表

Google Sheets按起止日期展开每日数据解决方案

方案1:内置函数实现(无需代码,实时更新)

适合数据量较小、需要原始数据修改后自动同步展开结果的场景,直接在空白单元格输入如下公式即可:

=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(BYROW(A2:C, LAMBDA(r, IF(OR(INDEX(r,1)="", INDEX(r,2)="", INDEX(r,3)=""),, INDEX(r,1)&"|"&SEQUENCE(INDEX(r,3)-INDEX(r,2)+1,1,INDEX(r,2),1))))),"|"),"WHERE Col2 IS NOT NULL FORMAT Col2 'yyyy/mm/dd'"))

参数调整说明:

  • A2:C 为你的原始数据范围,可根据实际表格结构修改
  • INDEX(r,1) 对应取每行第一列的附属信息(示例中的项目名),INDEX(r,2)为开始日期列,INDEX(r,3)为结束日期列,如果你表格里的列顺序不同,对应修改后面的数字即可
  • 末尾的FORMAT Col2 'yyyy/mm/dd' 可自定义日期显示格式,不需要可直接删除
  • 如果返回结果显示为数字,选中列后点击顶部菜单「格式」-「数字」-「日期」即可正常显示

方案2:Apps脚本实现(适合大量数据,性能更稳定)

如果数据量超过千行,函数运行容易卡顿,可使用脚本实现:

  1. 点击表格顶部菜单「扩展程序」-「Apps 脚本」
  2. 清空编辑器里的默认代码,粘贴如下内容:
function expandDates() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const originalData = sheet.getDataRange().getValues();
  const result = [];
  // 写入表头,可根据需求修改
  result.push([originalData[0][0], "展开日期"]);
  // 从第二行开始遍历原始数据
  for(let i = 1; i < originalData.length; i++) {
    const itemName = originalData[i][0];
    const startDate = new Date(originalData[i][1]);
    const endDate = new Date(originalData[i][2]);
    // 跳过空行/无效数据
    if(!itemName || isNaN(startDate.getTime()) || isNaN(endDate.getTime())) continue;
    // 遍历生成两个日期之间的所有日期
    for(let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) {
      result.push([itemName, new Date(d)]);
    }
  }
  // 结果从第1行第4列(D列)开始写入,可修改括号内的数字调整输出位置
  sheet.getRange(1, 4, result.length, result[0].length).setValues(result);
}
  1. 点击顶部保存按钮,命名项目后点击「运行」,按提示授权权限后即可返回表格查看结果,后续数据更新后重新运行脚本即可。

内容的提问来源于stack exchange,提问作者פיני צרויה

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:15:01