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脚本实现(适合大量数据,性能更稳定)
如果数据量超过千行,函数运行容易卡顿,可使用脚本实现:
- 点击表格顶部菜单「扩展程序」-「Apps 脚本」
- 清空编辑器里的默认代码,粘贴如下内容:
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); }
- 点击顶部保存按钮,命名项目后点击「运行」,按提示授权权限后即可返回表格查看结果,后续数据更新后重新运行脚本即可。
内容的提问来源于stack exchange,提问作者פיני צרויה
相关产品推荐
相关产品推荐

