Google Sheets脚本优化:标题中关键词匹配与批量编码赋值
实现Google Sheets标题含关键词自动匹配编码
问题分析
原脚本使用严格相等===判断,仅能匹配单元格内容完全一致的情况,无法满足"标题包含目标词即匹配"的需求。我们可以通过两种方式修改:
方案1:使用字符串包含判断(简单直接)
适合不需要复杂匹配规则(如全词匹配、大小写忽略)的场景,直接用String.includes()判断标题是否包含目标词:
修改后代码
function assignValues() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 仅获取有数据的行,避免空行循环浪费性能 var lastRowA = sheet.getLastRow(); var rangeA = sheet.getRange(1, 1, lastRowA, 1).getValues(); var rangeB = sheet.getRange(1, 2, lastRowA, 1).getValues(); var lastRowC = sheet.getRange("C:C").getValues().filter(String).length; var rangeC = sheet.getRange(1, 3, lastRowC, 1).getValues(); var rangeD = []; for (var i = 0; i < rangeC.length; i++) { var valueC = rangeC[i][0]; var foundCode = ""; // 遍历所有目标词 for (var j = 0; j < rangeA.length; j++) { var targetWord = rangeA[j][0]; // 跳过空的目标词,同时判断标题是否包含目标词 if (targetWord && valueC && valueC.includes(targetWord)) { foundCode = rangeB[j][0]; break; // 找到第一个匹配就停止,若要匹配多个可去掉break } } rangeD.push([foundCode]); } // 将结果写入D列,从第1行开始 sheet.getRange(1, 4, rangeD.length, 1).setValues(rangeD); }
关键修改点
- 替换原严格相等判断为
valueC.includes(targetWord),实现包含匹配 - 增加对空单元格的判断(
targetWord && valueC),避免空值导致的错误 - 优化范围获取,仅读取有数据的行,提升脚本运行效率
方案2:使用正则表达式(支持复杂匹配规则)
如果需要更灵活的匹配规则(如全词匹配、忽略大小写),可以用正则表达式:
修改后代码(以忽略大小写+全词匹配为例)
function assignValuesWithRegex() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var lastRowA = sheet.getLastRow(); var rangeA = sheet.getRange(1, 1, lastRowA, 1).getValues(); var rangeB = sheet.getRange(1, 2, lastRowA, 1).getValues(); var lastRowC = sheet.getRange("C:C").getValues().filter(String).length; var rangeC = sheet.getRange(1, 3, lastRowC, 1).getValues(); var rangeD = []; for (var i = 0; i < rangeC.length; i++) { var valueC = rangeC[i][0]; var foundCode = ""; for (var j = 0; j < rangeA.length; j++) { var targetWord = rangeA[j][0]; if (targetWord && valueC) { // 创建正则:\b表示单词边界,i表示忽略大小写 var regex = new RegExp(`\\b${targetWord}\\b`, 'i'); if (regex.test(valueC)) { foundCode = rangeB[j][0]; break; } } } rangeD.push([foundCode]); } sheet.getRange(1, 4, rangeD.length, 1).setValues(rangeD); }
正则规则说明
\\b:匹配单词边界,避免部分匹配(比如目标词"apple"不会匹配"applesauce")i:忽略大小写,目标词"Apple"可以匹配标题里的"apple"或"APPLE"- 若不需要全词匹配,去掉
\\b即可;若需要区分大小写,去掉'i'参数
额外说明
- 如果需要匹配多个关键词并返回所有对应编码,可以去掉循环里的
break,并将编码用逗号拼接(如foundCode += rangeB[j][0] + ",";),最后再处理掉末尾的逗号 - 脚本运行前建议先备份数据,避免意外覆盖
内容的提问来源于stack exchange,提问作者Eastland
相关产品推荐
相关产品推荐

