Google Apps Script实现数据倒序、分页与条数限制方案问询
解决方案
修改后的代码
function doGet(e) { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet1 = ss.getSheetByName("list_film"); const sheet2 = ss.getSheetByName("list_review"); // 获取表格表头与数据内容 const [sheet1Head, ...sheet1Values] = sheet1.getRange("A1:D" + sheet1.getLastRow()).getValues(); const [sheet2Head, ...sheet2Values] = sheet2.getRange("A1:C" + sheet2.getLastRow()).getValues(); // 转换为ID映射对象,简化关联查询 const sheet1Obj = sheet1Values .map(row => row.reduce((obj, val, idx) => ({ ...obj, [sheet1Head[idx]]: val }), {})) .reduce((map, item) => ({ ...map, [item.id]: item }), {}); // 注意:原逻辑中同一影片的多条评论会被覆盖为最后一条,此处保留原逻辑 const sheet2Obj = sheet2Values .map(row => row.reduce((obj, val, idx) => ({ ...obj, [sheet2Head[idx]]: val }), {})) .reduce((map, item) => ({ ...map, [item.id_film]: item }), {}); // 关联数据并倒序排列(最新数据在前) let res3 = Object.entries(sheet2Obj) .map(([k, v]) => ({ ...v, ...(sheet1Obj[k] || {}) })) .reverse(); // 处理分页参数 if (e?.parameter) { // 参数转数字并设置默认值 const page = parseInt(e.parameter.page) || 1; const limit = parseInt(e.parameter.limit) || 10; // 计算分页起始位置 const startIndex = (page - 1) * limit; // 截取对应分页数据(slice不修改原数组,性能更优) res3 = res3.slice(startIndex, startIndex + limit); } // 返回JSON格式结果 return ContentService.createTextOutput(JSON.stringify(res3)) .setMimeType(ContentService.MimeType.JSON); }
关键修改说明
- 倒序排列:关联数据后调用
reverse(),让表格最后一行的内容排在返回结果最前端。 - 分页支持:
- 从请求参数中读取
page(页码,默认1)和limit(每页条数,默认10),自动转换为数字类型。 - 通过
(page - 1) * limit计算分页起始索引,用slice()截取对应范围的数据。
- 从请求参数中读取
- 参数容错:对未传入的参数设置默认值,避免因参数缺失引发报错。
可选优化(针对多评论场景)
原代码中若list_review表存在同一影片的多条评论,会被覆盖为最后一条。如果需要保留所有评论,可修改评论数据的存储逻辑:
// 改为存储评论数组的映射对象 const sheet2Obj = sheet2Values .map(row => row.reduce((obj, val, idx) => ({ ...obj, [sheet2Head[idx]]: val }), {})) .reduce((map, item) => { if (!map[item.id_film]) map[item.id_film] = []; map[item.id_film].push(item); return map; }, {}); // 关联数据时展开评论数组 let res3 = Object.entries(sheet2Obj) .flatMap(([k, reviews]) => reviews.map(review => ({ ...review, ...(sheet1Obj[k] || {}) }))) .reverse();
内容的提问来源于stack exchange,提问作者T6VK
相关产品推荐
相关产品推荐

