Google Apps Script中Range类getValues返回二维数组问题咨询
关于getValues返回二维数组的疑问
getValues的设计就是始终返回二维数组,和你对文档的理解没有冲突:二维数组的第一级对应范围的行,第二级对应每一行的列数据。哪怕你只拉取单列数据,每一行的单个值也会被包裹在长度为1的数组中,这种统一返回格式的设计是为了适配所有范围类型(单列、单行、多行列),避免不同范围返回格式不一致导致的兼容问题。
优化方案
- 更简洁的降维方式
不用手动写for循环遍历,可以直接调用数组的flat()方法实现降维,代码更简洁。 - 优化范围取值逻辑
你代码中用getMaxRows()获取的是表格的最大行数(包含所有空行),所以才会出现拉取的行数比预期多的情况,改为使用getLastRow()获取最后一行有内容的行,就不需要手动裁剪数组长度。 - 重复值校验优化
用Set判断重复的效率远高于多次调用indexOf,数据量大的时候差距会更明显。
优化后的完整代码
function verficarCodUnico(){ const ss = SpreadsheetApp.getActive(); const sheet = ss.getActiveSheet(); const frozenRows = sheet.getFrozenRows(); const startRow = frozenRows + 1; // 计算实际需要拉取的有数据的行数 const dataRows = sheet.getLastRow() - frozenRows; // 拉取数据后直接降维为一维数组 const fCol = sheet.getRange(startRow, 1, dataRows).getValues().flat(); const repeated = []; const uniqueCache = new Set(); fCol.forEach(item => { if(uniqueCache.has(item)) { repeated.push(item); } else { uniqueCache.add(item); } }) // 此处可添加重复值后续处理逻辑 console.log('识别到的重复值:', repeated); }
原代码不生效的原因
你之前直接在二维数组中用indexOf判断重复,而JavaScript中数组是引用类型,[1] === [1]的判断结果为false,因此永远识别不到重复值,转为一维数组后比较的是数字等基础类型的值,判断逻辑就能正常运行。
内容的提问来源于stack exchange,提问作者Eduardo Silva
相关产品推荐
相关产品推荐

