如何合并同类别员工条目?调整for循环还是MySQL查询?
两种方案都能解决你的问题,但我更推荐先在Apps Script里对数据做分组预处理,再修改模板的循环逻辑——这样既能完整保留每个员工的详细信息,后续调整展示样式也更灵活。下面是具体的实现步骤:
方法1:在Apps Script中分组数据,修改模板循环
首先,在你获取JDBC结果集并传递给HtmlTemplate的那段Apps Script代码里,先把原始的data数组按task_name做分组处理,转换成“任务-员工列表”的结构:
// 假设data是从JDBC查询得到的原始数据数组 const groupedData = {}; data.forEach(row => { const taskName = row.task_name; // 如果当前任务还没在分组里,初始化一个空数组 if (!groupedData[taskName]) { groupedData[taskName] = []; } // 把当前员工的信息加入对应任务的数组 groupedData[taskName].push(row); }); // 转换成数组格式,方便模板遍历 const taskGroups = Object.entries(groupedData).map(([taskName, employees]) => ({ taskName, employees })); // 把分组后的数据传给模板,替换原来的data变量 template.taskGroups = taskGroups;
接下来修改你的HtmlTemplate代码,用嵌套循环实现:外层循环遍历每个任务分组,内层循环遍历该任务下的所有员工信息:
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <header> <h1 class="Title">Current Status</h1> </header> <ul> <li><a class="active" href="#home">Home</a></li> <li><a href="#news">News</a></li> <li><a href="#contact">Contact</a></li> <li><a href="#about">About</a></li> </ul> <!-- 外层循环:遍历每个任务分组 --> <? for(let taskGroup of taskGroups){ ?> <div class="data"> <div class="dataHeader"> <h2 class="dataHeaderText"> <?= taskGroup.taskName ?> </h2> </div> <h2> Current Workers</h2> <div class="col-container"> <!-- 员工列:遍历当前任务下的所有员工 --> <div class="col" style="background:#535351"> <h2>Employees</h2><hr> <? for(let employee of taskGroup.employees){ ?> <h4><?= employee.LastFirstName ?><br/></h4> <? } ?> </div> <!-- 日期时间列 --> <div class="col" style="background:#0b3e6b"> <h2>Date/Time</h2><hr> <? for(let employee of taskGroup.employees){ ?> <h4> <?= (employee.DateTime.getMonth() + 1) + "/" + employee.DateTime.getDate() + "/" + employee.DateTime.getFullYear() + " " + employee.DateTime.getHours() + ":" + employee.DateTime.getMinutes(); ?> </h4> <? } ?> </div> <!-- 时长列 --> <div class="col" style="background:#535351"> <h2>Duration</h2><hr> <? for(let employee of taskGroup.employees){ ?> <h4><?= employee.Duration + "\r" ?></h4> <? } ?> </div> </div> </div> <? } ?> </body> </html>
这样每个task_name只会生成一个条目,同一任务下的所有员工信息都会展示在对应的列中。
方法2:调整MySQL查询语句(适合聚合展示的场景)
如果你的需求只是展示员工列表,不需要每个员工的独立日期/时长(或者可以接受聚合后的信息),可以修改MySQL查询,用GROUP BY结合GROUP_CONCAT来聚合数据,比如:
SELECT task_name, GROUP_CONCAT(LastFirstName SEPARATOR '<br/>') AS employee_list, -- 可以按需聚合日期和时长信息 GROUP_CONCAT(CONCAT(DATE_FORMAT(DateTime, '%m/%d/%Y %H:%i'), ' (', Duration, ')') SEPARATOR '<br/>') AS time_duration_list FROM your_table_name GROUP BY task_name;
之后在模板里直接循环查询结果,把聚合后的字段直接输出即可。但这种方法的缺点是无法保留每个员工信息的独立结构,后续扩展展示逻辑会受限。
内容的提问来源于stack exchange,提问作者T.Zorgbini
相关产品推荐
相关产品推荐

