Google Apps Script的cari函数数据不匹配时重复执行异常
Google Apps Script
cari 函数运行异常修复 异常表现
- 输入的检索关键词和待匹配数据不匹配时,代码会重复发送消息,最多重复执行12次
异常现象截图:
- 输入检索关键词匹配到对应数据时,返回结果符合预期
正常效果截图:
问题原代码
function cari(cid,cmd){ var txt = ''; var pola = cmd.match(/cari#(.+)/); if (pola[1]!=''){ var rs = bacadata(); for (var i=0;i<rs.length;i++) { if (rs[i][0] == pola[1]){ txt = pola[1]+' adalah '+rs[i][1]; sendMessage(cid,txt); } else{ txt = 'Data '+pola[1]+' tidak ditemukan atau perintah command tidak sesuai...'; sendMessage(cid,txt); } } } }
问题原因
原代码存在3处逻辑漏洞:
- 判断逻辑写在循环内部,每遍历一行数据就做一次匹配校验,只要当前行不匹配关键词就立刻发送「数据不存在」提示,遍历多少行就会发多少次提示,重复12次是因为
bacadata()返回的数据集总共有12行 - 就算中途匹配到了正确数据,循环也不会终止,会继续遍历剩余行,重复发送错误提示
- 缺少正则匹配结果的空值校验,如果输入命令不符合
cari#xxx格式,cmd.match()会返回null,直接访问pola[1]会抛出脚本运行错误
修复后代码
function cari(cid,cmd){ var txt = ''; var pola = cmd.match(/cari#(.+)/); // 先校验正则匹配结果,避免空指针报错 if (pola && pola[1]!=''){ var rs = bacadata(); var isFound = false; var keyword = pola[1]; for (var i=0;i<rs.length;i++) { if (rs[i][0] == keyword){ txt = keyword+' adalah '+rs[i][1]; sendMessage(cid,txt); isFound = true; // 匹配到目标数据后立刻终止循环,避免多余遍历 break; } } // 遍历完全部数据都没匹配到,才发送一次不存在提示 if (!isFound) { txt = 'Data '+keyword+' tidak ditemukan atau perintah command tidak sesuai...'; sendMessage(cid,txt); } } }
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

