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

如何合并同类别员工条目?调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:40:26