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

Google Apps Script侧边栏实现员工ID匹配姓名及状态记录的技术问询

员工状态提交侧边栏优化方案

针对你需要实现的「输入员工ID自动显示姓名、高效搜索、错误提示及完整数据提交」需求,以下是具体的代码实现和优化思路:

一、核心优化思路

因为员工数据量可达8500行且频繁更新,核心是一次性加载数据到前端缓存,用对象映射实现O(1)时间复杂度的ID查找,避免反复读取表格数据拖慢响应;同时在前端做实时输入校验和反馈,提升交互体验。

二、前端侧边栏代码(HTML+JS)

创建名为Sidebar的HTML文件,包含输入表单、实时反馈区域和交互逻辑:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
      .form-group { margin: 12px 0; }
      label { display: block; margin-bottom: 4px; }
      input, select { padding: 6px; width: 220px; }
      .name-display { margin-top: 4px; font-weight: 600; color: #2c3e50; }
      .error-msg { margin-top: 4px; color: #e74c3c; display: none; }
      #submitBtn { padding: 8px 16px; background: #3498db; color: white; border: none; border-radius: 4px; cursor: pointer; }
      #submitBtn:hover { background: #2980b9; }
    </style>
  </head>
  <body>
    <div class="form-group">
      <label>员工ID</label>
      <input type="text" id="empId" placeholder="请输入员工ID">
      <div id="empName" class="name-display"></div>
      <div id="errorMsg" class="error-msg">未匹配到该员工ID,请检查输入</div>
    </div>
    <div class="form-group">
      <label>状态更新</label>
      <select id="status">
        <option value="">选择状态</option>
        <option value="在岗">在岗</option>
        <option value="外出办公">外出办公</option>
        <option value="带薪休假">带薪休假</option>
        <option value="病假">病假</option>
      </select>
    </div>
    <button id="submitBtn">提交状态</button>

    <script>
      // 缓存员工ID与姓名的映射表
      let employeeMap = {};

      // 页面加载时拉取所有员工数据
      window.onload = () => {
        google.script.run
          .withSuccessHandler(data => {
            // 将二维数组转换为ID为键、姓名为值的对象
            data.forEach(row => employeeMap[row[0]] = row[1]);
          })
          .getEmployeeData();
      };

      // 监听ID输入框的实时变化
      document.getElementById('empId').addEventListener('input', function() {
        const inputId = this.value.trim();
        const nameEl = document.getElementById('empName');
        const errorEl = document.getElementById('errorMsg');

        if (!inputId) {
          nameEl.textContent = '';
          errorEl.style.display = 'none';
          return;
        }

        if (employeeMap[inputId]) {
          nameEl.textContent = `匹配姓名:${employeeMap[inputId]}`;
          errorEl.style.display = 'none';
        } else {
          nameEl.textContent = '';
          errorEl.style.display = 'block';
        }
      });

      // 提交按钮点击逻辑
      document.getElementById('submitBtn').addEventListener('click', () => {
        const empId = document.getElementById('empId').value.trim();
        const status = document.getElementById('status').value;
        const empName = employeeMap[empId];

        // 输入校验
        if (!empId || !empName) {
          alert('请输入有效的员工ID');
          return;
        }
        if (!status) {
          alert('请选择员工状态');
          return;
        }

        // 提交到后端处理
        google.script.run
          .withSuccessHandler(() => {
            alert('状态提交成功!');
            // 重置表单
            document.getElementById('empId').value = '';
            document.getElementById('empName').textContent = '';
            document.getElementById('status').value = '';
            document.getElementById('errorMsg').style.display = 'none';
          })
          .submitStatus(empId, empName, status);
      });
    </script>
  </body>
</html>

三、后端Apps Script代码

在脚本编辑器中添加以下函数,负责数据读取和日志提交:

// 打开侧边栏的入口函数,可绑定到工作表的自定义菜单
function showStatusSubmissionSidebar() {
  const htmlOutput = HtmlService.createHtmlOutputFromFile('Sidebar')
    .setTitle('员工状态提交');
  SpreadsheetApp.getUi().showSidebar(htmlOutput);
}

// 获取员工ID和姓名数据(从命名范围"Confirm"读取)
function getEmployeeData() {
  const activeSs = SpreadsheetApp.getActiveSpreadsheet();
  const confirmRange = activeSs.getRangeByName('Confirm');
  
  // 校验命名范围是否存在
  if (!confirmRange) throw new Error('未找到名为"Confirm"的单元格范围,请检查设置');
  
  // 获取所有数据并过滤空行,提取第1列(ID)和第3列(姓名)
  return confirmRange.getValues()
    .filter(row => row[0] !== '') // 过滤ID为空的行
    .map(row => [row[0], row[2]]); // 仅保留ID和姓名
}

// 提交状态到日志工作簿
function submitStatus(empId, empName, status) {
  // 替换为你的日志工作簿ID
  const logSpreadsheetId = '替换成日志工作簿的ID';
  const logSs = SpreadsheetApp.openById(logSpreadsheetId);
  // 找到日志表,不存在则新建
  const logSheet = logSs.getSheetByName('状态日志') || logSs.insertSheet('状态日志');
  
  // 追加包含时间戳的完整数据
  const timestamp = new Date();
  logSheet.appendRow([timestamp, empId, empName, status]);
}

四、关键注意事项

  1. 命名范围校验:确保Confirm范围正确指向Import表中包含员工ID(第1列)和姓名(第3列)的区域,可通过「数据→命名范围」设置维护。
  2. 权限设置:确保当前脚本有访问日志工作簿的权限,首次运行时会弹出授权提示,需按步骤完成授权。
  3. 性能优化:一次性加载所有员工数据到前端,避免每次输入都调用后端API,8500行数据转换为对象后,前端查找几乎无延迟。
  4. 异常扩展:可在后端submitStatus函数中添加try-catch块,处理日志工作簿不存在、权限不足等异常,返回更友好的错误提示。

内容的提问来源于stack exchange,提问作者Alpaca Pat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:33