You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Sheet中用列值生成对象?脚本错误排查及修复

问题分析与修复方案

嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来拆解:

为啥只拿到最后一个键值对?

你的代码里有两个关键问题:

  1. nameList没有初始化:一开始nameList是undefined,第一次循环赋值后才变成单个键值对的对象,但后续循环里,你用nameList = Object.assign(name)直接把它替换成了新的对象——相当于每次循环都把之前攒的东西全丢了,只保留当前这一项,最后自然只剩最后一个非空值啦。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:32:44