Google Apps Script中二维列表格式异常及去重问题求解
问题与解决方案
问题背景
处理表格中编辑者(editors)和市场(markets)数据时,编写JonSnow函数后得到的editor列表为[[Name1],[Name2],[Name1]]格式,导致[...new Set(editor)]无法有效去重,期望得到一维数组["Name1","Name2","Name1"]。
三个问题的解答
格式名称:这是二维数组(具体是由多个单元素一维数组组成的二维数组)。
生成原因:
Google Apps Script的getDisplayValues()方法返回的是二维数组结构——外层数组对应表格的行,每个内层数组对应该行的单元格值。即使只选取单列(如示例中的J列),每一行的单元格值也会被包装为一个单元素数组,因此遍历data时,val本身就是一个单元素数组,直接push到editor里就会形成二维数组。修复/避免方法:
有两种常用方式解决:
- 方式一:遍历取子数组的第一个元素
在editor.push(val)处改为editor.push(val[0]),直接提取单元格的文本值存入数组:
editor.push(val[0]) market.push(markett)
- 方式二:提前扁平化二维数组
在获取data后,用flat()方法将二维数组转为一维数组,后续遍历直接处理单个值:
var data = range.getDisplayValues().flat();
修改后遍历逻辑中,val就直接是单元格文本值,无需再取值。
另外,去重时因为数组元素变为字符串,[...new Set(editor)]就能正常工作,得到唯一编辑者列表。
修正后的完整代码
function JonSnow() { var sheet = SpreadsheetApp.getActiveSheet(); var range = sheet.getRange("XX!J1:J114"); var data = range.getDisplayValues(); Logger.log(JSON.stringify(data)); const editor = []; const market = []; data.forEach( (val, index) =>{ // 取子数组的第一个元素作为判断值 const editorName = val[0]; if(editorName != "None - regular editor" && editorName != "N/A" && editorName != "Cov?" && editorName != "" && editorName != "None - no cross-market coverage for this task"){ let markett; // 声明变量,避免全局污染 if(index >= 2 && index <= 12){ markett = "Dach"; }else if (index >= 15 && index <= 30) { markett = "Dutch"; }else if (index >= 32 && index <= 48) { markett = "French"; }else if (index >= 52 && index <= 64) { markett = "Italian"; }else if (index >= 67 && index <= 74) { markett = "Nordics"; }else if (index >= 77 && index <= 92) { markett = "polish"; }else if (index >= 95 && index <= 114) { markett = "Uk"; }; editor.push(editorName) market.push(markett) } else { return; }; }); Logger.log(editor); Logger.log(market); const edunique = [...new Set(editor)]; Logger.log(edunique); // 新增日志查看去重结果 }
注:代码中还修复了markett未声明的问题,避免全局变量污染。
内容的提问来源于stack exchange,提问作者Nelerdeth
相关产品推荐
相关产品推荐

