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

正则表达式多类别匹配:循环变量引用失效问题求助

解决动态变量引用与多类别正则匹配问题

你现在遇到的核心问题是动态变量名的引用误区——直接拼接字符串"Cat"+i只会得到字面量文本,没法指向你定义的Cat1、Cat2这类变量。下面给你两种实用解决方案,优先推荐更规范的数组管理方式:

方案1:用数组统一管理类别正则(推荐)

把所有Cat1、Cat2...Catx的正则表达式存进数组,遍历起来更直观,还能避免动态变量名的潜在问题:

if(studentmarks && studentmarks.length > 0 && assign.maxPoints > 0){ 
  // 把所有类别正则和对应名称按顺序存入数组
  const categoryPatterns = [Cat1, Cat2, Cat3]; // 根据你的实际数量补充
  const categoryNames = ["Cat1", "Cat2", "Cat3"];
  
  for (d = 0; d < studentmarks.length; d++){ 
    var marks = studentmarks[d]; 
    if(student.userId == marks.userId){ 
      var ss = SpreadsheetApp.openByUrl(url).getSheetByName(shet); 
      
      // 遍历所有类别进行匹配
      for(let i = 0; i < categoryPatterns.length; i++){
        const re = RegExp(categoryPatterns[i]);
        const category = categoryNames[i];
        if (assign.title.match(re)) {
          ss.appendRow([category, assign.title, marks.assignedGrade, assign.maxPoints]);
          // 如果一个标题只属于一个类别,匹配到后可以break跳出循环
          break;
        }
      }
    }
  }
}

方案2:动态引用全局变量(适合保留原有变量结构的场景)

如果你的Cat1、Cat2是全局定义的变量,在Google Apps Script里可以通过this[Cat${i}]动态获取变量值,循环直到变量为空:

if(studentmarks && studentmarks.length > 0 && assign.maxPoints > 0){ 
  for (d = 0; d < studentmarks.length; d++){ 
    var marks = studentmarks[d]; 
    if(student.userId == marks.userId){ 
      var ss = SpreadsheetApp.openByUrl(url).getSheetByName(shet); 
      
      // 从Cat1开始循环,直到变量无数据
      let i = 1;
      while(true){
        const catKey = `Cat${i}`;
        const catPattern = this[catKey]; // 动态获取全局变量
        if(!catPattern) break; // 变量为空时终止循环
        
        const re = RegExp(catPattern);
        if (assign.title.match(re)) {
          ss.appendRow([catKey, assign.title, marks.assignedGrade, assign.maxPoints]);
          // 按需决定是否break:若一个标题可能匹配多类别则去掉break
          // break;
        }
        i++;
      }
    }
  }
}

关于后续“类别分配电子表格列”的思路

你可以提前定义类别与列的映射关系,比如:

const categoryColumnMap = {
  "Cat1": 1, // 对应A列
  "Cat2": 2, // 对应B列
  // ... 其他类别映射
};

匹配到类别后,就可以用ss.getRange(targetRow, categoryColumnMap[category])定位到对应列写入数据,替代appendRow实现指定列的写入逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:43:14