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

Apps Script两数组字符串匹配及赋值功能实现问题

Apps Script 商品-库位匹配实现方案

首先修正原有代码的基础错误:

  • 原代码中定义Locations工作表的变量名为locss,后续读取范围时错误引用了不存在的locationssheet变量,行号变量lastlocRow也误写为lastlocationRow,已在下方代码中修正
  • 原代码仅读取了工作表数据到数组,未在匹配完成后将结果写回表格,已补充批量写回逻辑提升运行效率

匹配逻辑实现规则

严格按照需求优先级实现匹配流程:

  1. 优先遍历所有库位做主属性精确匹配,匹配成功则将商品ID写入对应库位,直接终止当前商品的匹配流程
  2. 主属性全量遍历无匹配时,从头遍历所有库位做次级属性子串匹配,匹配成功同样写入ID后终止流程
  3. 两轮匹配均无结果时,直接跳过当前商品处理下一条
  4. 已分配ID的库位默认不参与后续匹配,若需要覆盖分配可删除代码中对应判断行

核心语法说明

  • 精确字符串判断:使用===严格相等比较,提前对两边值做String()类型转换、trim()去首尾空格,避免单元格格式为数字、存在不可见空格导致匹配失效
  • 子串判断:使用原生String.includes()方法,直接返回布尔值表示目标属性是否为次级属性字符串的子串
  • 匹配标记位:用布尔变量matchSuccess记录当前商品是否匹配成功,控制是否进入第二轮子串匹配,同时匹配成功后通过break及时终止循环减少无效遍历

完整可运行代码

function matchcodes() {
  const activeSs = SpreadsheetApp.getActiveSpreadsheet();
  // 读取库位表数据
  const locSheet = activeSs.getSheetByName('Locations');
  const lastLocRow = locSheet.getLastRow();
  // 库位数据从第2行开始读取,对应A到D列
  const locations = locSheet.getRange("A2:D" + lastLocRow).getValues();

  // 读取新商品表数据
  const itemSheet = activeSs.getSheetByName('New Items');
  const lastItemRow = itemSheet.getLastRow();
  const itemcodes = itemSheet.getRange("A1:B" + lastItemRow).getValues();

  // 逐商品匹配
  for (let i = 0; i < itemcodes.length; i++) {
    const targetAttr = String(itemcodes[i][0]).trim();
    const targetItemId = itemcodes[i][1];
    let matchSuccess = false;

    // 第一轮:主属性精确匹配
    for (let j = 0; j < locations.length; j++) {
      // 跳过已有ID的库位,不需要可删除
      if (locations[j][1]) continue;
      const mainAttr = String(locations[j][2]).trim();
      if (targetAttr === mainAttr) {
        locations[j][1] = targetItemId;
        matchSuccess = true;
        break;
      }
    }

    // 第一轮未匹配,进入第二轮子串匹配
    if (!matchSuccess) {
      for (let j = 0; j < locations.length; j++) {
        if (locations[j][1]) continue;
        const subAttr = String(locations[j][3]).trim();
        if (subAttr.includes(targetAttr)) {
          locations[j][1] = targetItemId;
          matchSuccess = true;
          break;
        }
      }
    }
  }

  // 将匹配结果批量写回库位表的B列(商品ID列)
  const writeValues = locations.map(row => [row[1]]);
  locSheet.getRange(2, 2, writeValues.length, 1).setValues(writeValues);
}

代码采用批量读、批量写的方式操作表格,比逐单元格读写速度快数倍,适合数据量较大的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:20