Google Sheets Web app返回多层嵌套JSON结构实现方案
实现方案
修改原有getData函数的遍历逻辑,通过临时索引做层级归类,把扁平化的行数据组装为「剧集-季-单集」三层嵌套结构,替换原有代码即可生效。
完整修改后代码
function doGet(e){ var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/sskey/edit#gid=0"); var sheet = ss.getSheetByName("TV_Series"); return getData(sheet); } function getData(sheet){ var res = {}; // 临时索引,避免重复创建同剧集、同季对象 const seriesCache = {}; const rows = sheet.getRange(2,1,sheet.getLastRow()-1, sheet.getLastColumn()).getValues(); for(let i = 0; i < rows.length; i++){ const row = rows[i]; // 逐行提取字段,季数、集数转数字匹配预期结构类型 const seriesName = row[0]; const seasonName = row[1]; const seasonNum = Number(row[2]); const epName = row[3]; const epNum = Number(row[4]); const mediaUrl = row[8]; // 初始化不存在的剧集节点 if(!seriesCache[seriesName]){ seriesCache[seriesName] = { name: seriesName, seasons: [], seasonCache: {} } } const curSeries = seriesCache[seriesName]; // 初始化不存在的季节点 if(!curSeries.seasonCache[seasonNum]){ const newSeason = { name: seasonName, season_number: seasonNum, episodes: [] } curSeries.seasons.push(newSeason); curSeries.seasonCache[seasonNum] = newSeason; } const curSeason = curSeries.seasonCache[seasonNum]; // 追加当前单集到对应季下 curSeason.episodes.push({ name: epName, episode_number: epNum, url: mediaUrl }) } // 单剧集返回(和你给出的示例结构一致) res.series = Object.values(seriesCache)[0]; // 若表格存储多部剧,注释上一行,放开下一行即可返回多剧集列表 // res.series = Object.values(seriesCache); return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON); }
逻辑说明
- 遍历行数据时通过缓存对象判断当前剧集、季是否已创建,避免生成重复节点
- 自动将表格读取到的季数、集数字符串转为数值类型,匹配预期结构的字段格式
- 输出字段完全对齐给出的示例:单集媒体地址字段名为
url,移除了扁平化结构中冗余的跨层级字段 - 预留多剧集支持,仅需修改一行代码即可适配表格存储多部剧的场景
如果表格内单集顺序混乱,可在组装完数据后对每个季下的
episodes数组按episode_number做升序排序,保证返回顺序正确。
内容的提问来源于stack exchange,提问作者Amir Flax
相关产品推荐
相关产品推荐

