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

Google Apps Script:如何通过姓氏匹配数组批量设置部门列值

修正你的Google Apps Script代码

你的代码存在几个关键问题,导致无法正确为每行匹配对应部门:

  • workingCell 定义在循环外部,且提前使用了未初始化的i,根本无法获取当前行的姓氏内容
  • 判断逻辑完全错误:用赋值运算符=代替了判断相等的===,而且Array.isArray()是用来检测变量是否为数组的,不是检查元素是否存在于数组中
  • 循环内反复调用getRange()和setValue(),频繁操作表格API会导致运行效率极低,行数多的时候卡顿明显

下面是修正并优化后的代码:

function setDepartment() {
  const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // 用对象映射部门与对应姓氏,后续新增部门只需添加键值对,无需修改循环逻辑
  const departmentMap = {
    "Department One": ['SURNAME1','SURNAME2','SURNAME3'],
    "Department Two": ['SURNAME4','SURNAME5','SURNAME6']
  };

  // 批量读取第2列(姓氏列)第4到25行的数据,减少API调用次数
  const surnameRange = activeSheet.getRange(4, 2, 22, 1); // 行4至25共22行,列索引为2
  const surnames = surnameRange.getValues().flat(); // 将二维数组转为一维数组,方便遍历

  // 准备要写入第1列(部门列)的结果数据
  const departmentResults = [];
  for (const surname of surnames) {
    let matchedDept = "";
    // 遍历所有部门,匹配当前姓氏
    for (const deptName in departmentMap) {
      if (departmentMap[deptName].includes(surname)) {
        matchedDept = deptName;
        break; // 找到匹配部门后立即终止循环,避免无效遍历
      }
    }
    departmentResults.push([matchedDept]); // 保持二维数组格式,适配批量写入要求
  }

  // 批量写入部门结果到第1列第4到25行
  activeSheet.getRange(4, 1, 22, 1).setValues(departmentResults);
}

关键优化说明:

  • 对象映射结构:相比多个独立数组,用对象存储部门与姓氏的对应关系,后续新增部门只需在对象内添加新的键值对,代码扩展性更强
  • 批量读写操作:一次性读取所有需要处理的姓氏,处理完成后再一次性写入结果,大幅降低对Google Sheets API的调用次数,提升运行效率
  • 清晰的匹配逻辑:用includes()方法直接判断姓氏是否在对应部门数组中,逻辑直观易懂
  • 终止多余遍历:找到匹配部门后立即跳出循环,避免不必要的遍历操作

额外提示:

  • 如果单元格内是全名(比如「张三」而非「张」),需要先提取姓氏再匹配,中文姓氏可通过surname.split("")[0]取第一个字,具体可根据实际姓名格式调整
  • 运行脚本前确保拥有当前表格的编辑权限,通过Google Sheets的「扩展程序>Apps脚本」打开编辑器执行代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:27:45