请求协助:将Google Sheet列数据转换为行以优化展示格式
解决方案:用Google Apps Script自动整合预订数据
核心思路
根据Sheet1中E、H、K列的「还有更多行?」标记,将同个预订的多行项目合并到Output Sheet的单行中,实现结构化展示。同个预订的行是连续的,当某行对应列标记为「是」时,下一行的对应项目需合并到当前预订的字段中。
实现脚本
打开你的Google表格,点击「扩展程序」→「Apps脚本」,替换默认代码为以下内容:
function consolidateBookings() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName("Sheet1"); const outputSheet = ss.getSheetByName("Output"); // 清空Output表已有数据(保留表头) outputSheet.getRange(2, 1, outputSheet.getLastRow()-1, outputSheet.getLastColumn()).clearContent(); const sourceData = sourceSheet.getDataRange().getValues(); const outputHeader = outputSheet.getRange(1, 1, 1, outputSheet.getLastColumn()).getValues()[0]; let currentBooking = {}; let outputRowIndex = 2; // 从第2行开始写入数据 // 遍历源数据(跳过表头) for (let i = 1; i < sourceData.length; i++) { const row = sourceData[i]; const timestamp = row[0]; const name = row[1]; // 第一组项目及判断列 const item1 = row[2]; const qty1 = row[3]; const more1 = row[4]; // 第二组项目及判断列 const item2 = row[6]; const qty2 = row[7]; const more2 = row[8]; // 第三组项目及判断列 const item3 = row[9]; const qty3 = row[10]; const more3 = row[11]; // 初始化当前预订(新预订触发) if (!currentBooking.timestamp) { currentBooking = { timestamp: timestamp, name: name, items: [], qtys: [] }; } // 收集当前行的有效项目 if (item1) { currentBooking.items.push(item1); currentBooking.qtys.push(qty1); } if (item2) { currentBooking.items.push(item2); currentBooking.qtys.push(qty2); } if (item3) { currentBooking.items.push(item3); currentBooking.qtys.push(qty3); } // 判断当前预订是否结束:所有组标记为「否」,或到达最后一行 const isLastRow = (i === sourceData.length - 1); const isBookingComplete = (more1 === "否" && more2 === "否" && more3 === "否") || isLastRow; if (isBookingComplete) { // 合并项目与数量(换行分隔) const combinedItems = currentBooking.items.join("\n"); const combinedQtys = currentBooking.qtys.join("\n"); // 匹配Output表头写入数据 const outputRow = []; outputHeader.forEach(col => { switch(col) { case "时间戳": outputRow.push(currentBooking.timestamp); break; case "姓名": outputRow.push(currentBooking.name); break; case "项目": outputRow.push(combinedItems); break; case "数量": outputRow.push(combinedQtys); break; default: outputRow.push(""); } }); outputSheet.getRange(outputRowIndex, 1, 1, outputRow.length).setValues([outputRow]); outputRowIndex++; // 重置预订对象,准备下一组 currentBooking = {}; } } // 自动调整行高适配换行内容 outputSheet.autoResizeRows(2, outputRowIndex-1); }
使用步骤
- 确保Output表已设置对应表头(如「时间戳」「姓名」「项目」「数量」,可根据实际修改脚本内表头匹配逻辑)
- 保存脚本,点击运行按钮,授权脚本访问表格数据
- 运行完成后查看Output表,即可看到整合后的结构化数据
自定义调整
- 若Output表头不同,修改脚本中
switch(col)的匹配项 - 如需替换换行分隔符,将
join("\n")改为join("; ")等其他符号 - 若分组逻辑不是连续行,可根据订单号等唯一标识调整判断条件
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

