正则表达式多类别匹配:循环变量引用失效问题求助
解决动态变量引用与多类别正则匹配问题
你现在遇到的核心问题是动态变量名的引用误区——直接拼接字符串"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
相关产品推荐
相关产品推荐

