如何在Google Sheet中用列值生成对象?脚本错误排查及修复
问题分析与修复方案
嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来拆解:
为啥只拿到最后一个键值对?
你的代码里有两个关键问题:
nameList没有初始化:一开始nameList是undefined,第一次循环赋值后才变成单个键值对的对象,但后续循环里,你用nameList = Object.assign(name)直接把它替换成了新的对象——相当于每次循环都把之前攒的东西全丢了,只保留当前这一项,最后自然只剩最后一个非空值啦。Object.assign用法不对:Object.assign(name)其实是创建了一个新对象(把name的属性复制进去),但你把这个新对象直接赋值给nameList,而不是把新属性合并到已有的nameList里。
修复后的代码(两种写法)
写法1:修改原循环逻辑
直接初始化空对象,循环里逐个添加属性:
function getIngredientsList() { const url = "SPREADSHEET_URL"; const ss = SpreadsheetApp.openByUrl(url); const ws = ss.getSheetByName('Base'); const names = ws.getRange(2, 3, ws.getLastRow() - 1).getValues().map(a => a[0]); // 初始化空对象,用来存储所有键值对 let nameList = {}; for (let i = 0; i < names.length; i++){ if (names[i] !== ""){ // 直接给nameList添加新的键值对,不会覆盖之前的内容 nameList[names[i]] = names[i]; } } return nameList; }
写法2:用reduce简化代码(更优雅)
数组的reduce方法天生适合这种“把数组转换成对象”的场景,代码更简洁:
function getIngredientsList() { const url = "SPREADSHEET_URL"; const ss = SpreadsheetApp.openByUrl(url); const ws = ss.getSheetByName('Base'); const names = ws.getRange(2, 3, ws.getLastRow() - 1).getValues().map(a => a[0]); // 用reduce累加生成目标对象 return names.reduce((resultObj, currentName) => { if (currentName !== "") { resultObj[currentName] = currentName; } return resultObj; }, {}); // 第二个参数是初始值:空对象 }
验证效果
不管用哪种写法,最终都会返回你想要的格式:{'value[0]':value[0], 'value[1]':value[1],..., 'value[i]':value[i]}(这里的value[i]就是你表格里的非空值)。
内容的提问来源于stack exchange,提问作者Timogavk
相关产品推荐
相关产品推荐

