如何在Google Apps Script中构建正确的Client-Project配对3D数组?
重构代码实现客户-项目行级配对
原代码的问题在于使用了嵌套循环,导致每个客户与所有项目进行配对,而我们需要的是同一行的客户和项目一一关联。以下是两种重构方案:
方案1:修改原循环逻辑
直接遍历行索引,取对应位置的客户和项目,无需内层循环:
const ss = SpreadsheetApp.openById("1BWutWGYPW9RjewRNdgLdHCn-Rytbyi63xbPF2Hd3tPg"); function getProjects(){ const projectsSH = ss.getSheetByName("Projects"); // 一次性获取B列(客户)到H列(项目)的所有数据,减少API调用次数 const data = projectsSH.getRange(2, 2, projectsSH.getLastRow()-1, 7).getValues(); const clientProjectPairs = []; for (let i = 0; i < data.length; i++){ // 提取当前行的客户和项目,包装成要求的数组格式 const client = [data[i][0]]; // B列对应数组第0个索引 const project = [data[i][6]]; // H列对应数组第6个索引 clientProjectPairs.push([client, project]); } Logger.log(clientProjectPairs); return clientProjectPairs; }
方案2:使用数组map方法更简洁
利用map遍历每行数据,直接生成目标格式:
const ss = SpreadsheetApp.openById("1BWutWGYPW9RjewRNdgLdHCn-Rytbyi63xbPF2Hd3tPg"); function getProjects(){ const projectsSH = ss.getSheetByName("Projects"); const data = projectsSH.getRange(2, 2, projectsSH.getLastRow()-1, 7).getValues(); const clientProjectPairs = data.map(row => [[row[0]], [row[6]]]); Logger.log(clientProjectPairs); return clientProjectPairs; }
关键说明
- 去掉冗余嵌套循环:客户和项目按行一一对应,索引完全匹配,只需遍历一次行即可完成配对。
- 优化数据获取:一次性获取B到H列的整段数据,比单独调用两次
getRange更节省API资源,提升脚本运行效率。 - 匹配目标格式:最终生成的
clientProjectPairs结构为[[[客户1], [项目1]], [[客户2], [项目2]], ...],完全符合你需要的3D数组格式。
内容的提问来源于stack exchange,提问作者Apalila
相关产品推荐
相关产品推荐

