如何使用App Script基于其他工作表的ID列表过滤抓取的数据?
问题
我需要抓取数据,但仅筛选出第13列(Col13)的ID存在于另一工作表中的记录。目前已实现硬编码单个ID的筛选逻辑,代码如下:
var sid = ss.getSheetByName('sid list').getRange('A2:A').getValues(); //capture list of IDs if(temp[13] == 243558369) { temp.push(counter) // console.log(temp) toPrint.push(temp) counter++ }
待匹配的ID列表通过以下代码获取:
var sid = ss.getSheetByName('sid list').getRange('A2:A').getValues(); //capture list of IDs
请指导如何修改代码以实现基于该ID列表的筛选。
解决方案
核心是先把获取到的ID列表转换成高效查找的集合(Set),再用集合判断当前行ID是否符合条件,具体修改如下:
修改后的代码片段
// 优化获取ID列表的逻辑,避免读取空行 var sidSheet = ss.getSheetByName('sid list'); var lastRow = sidSheet.getLastRow(); // 只读取有数据的范围:从A2到最后一行的A列 var sidRange = sidSheet.getRange(2, 1, lastRow - 1, 1); var sidValues = sidRange.getValues(); // 把二维数组转成一维数组,过滤空值后存入Set var idSet = new Set(sidValues.flat().filter(id => id !== "")); // 修改原筛选判断逻辑 if(idSet.has(temp[13])) { temp.push(counter) // console.log(temp) toPrint.push(temp) counter++ }
关键说明
- 用
getLastRow()获取工作表最后一行数据的行号,避免读取大量无意义的空行,提升运行效率 flat()方法将getValues()返回的二维数组(格式为[[id1], [id2], ...])转换成一维数组filter(id => id !== "")过滤列表中的空值,避免无效空ID存入Set- Set的
has()方法判断元素是否存在的时间复杂度为O(1),比直接遍历数组的效率高很多,尤其适合ID数量较多的场景
内容的提问来源于stack exchange,提问作者Kreng Kongkeng
相关产品推荐
相关产品推荐

