如何用Google Apps Script实现考勤表同日期C列合并并计算当日总时长
Google Sheets 考勤自动汇总合并实现方案
实现逻辑
- 读取A列日期、B列时长的全量数据
- 按日期维度对行数据分组,统计每组的行范围和B列总时长
- 清空C列原有内容和合并格式,避免旧数据干扰
- 对每个日期分组,合并对应行的C列单元格,写入当日总工时
完整实现代码
function calculateAndMergeDailyTotal() { // 获取当前工作表,可替换为getSheetByName('表名')指定固定工作表 const sheet = SpreadsheetApp.getActiveSheet(); const startRow = 2; // 数据起始行,若表头占N行则设置为N+1 const lastRow = sheet.getLastRow(); // 无有效数据直接终止运行 if (lastRow < startRow) return; // 读取A、B列的所有数据 const dataRange = sheet.getRange(startRow, 1, lastRow - startRow + 1, 2); const data = dataRange.getValues(); // 清空C列原有内容和合并格式 const colCRange = sheet.getRange(startRow, 3, lastRow - startRow + 1, 1); colCRange.breakApart(); colCRange.clearContent(); const groups = []; let currentDate = data[0][0]?.getTime(); let currentStartRow = startRow; let currentTotal = data[0][1] || 0; // 遍历数据按日期分组 for (let i = 1; i < data.length; i++) { const rowDate = data[i][0]?.getTime(); const rowDuration = data[i][1] || 0; if (rowDate === currentDate) { currentTotal += rowDuration; } else { groups.push({ start: currentStartRow, end: startRow + i - 1, total: currentTotal }); currentDate = rowDate; currentStartRow = startRow + i; currentTotal = rowDuration; } } // 存入最后一组数据 groups.push({ start: currentStartRow, end: lastRow, total: currentTotal }); // 执行C列合并和数值写入 groups.forEach(group => { const mergeRange = sheet.getRange(group.start, 3, group.end - group.start + 1, 1); mergeRange.mergeVertically(); mergeRange.setValue(group.total); // 可选配置:设置垂直居中对齐 mergeRange.setVerticalAlignment('middle'); }); }
使用方法
- 打开目标Google表格,点击顶部菜单栏「扩展程序」>「Apps 脚本」进入脚本编辑器
- 清空编辑器内默认代码,粘贴上述代码后保存项目
- 手动执行:点击编辑器顶部的运行按钮,首次运行需按提示完成账号授权
- 自动触发:在脚本编辑器左侧点击「触发器」按钮,添加新触发器,选择
calculateAndMergeDailyTotal函数,触发条件设置为「当电子表格更改时」,即可实现修改数据后自动更新汇总
内容的提问来源于stack exchange,提问作者Leow
相关产品推荐
相关产品推荐

