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

请求协助:将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);
}

使用步骤

  1. 确保Output表已设置对应表头(如「时间戳」「姓名」「项目」「数量」,可根据实际修改脚本内表头匹配逻辑)
  2. 保存脚本,点击运行按钮,授权脚本访问表格数据
  3. 运行完成后查看Output表,即可看到整合后的结构化数据

自定义调整

  • 若Output表头不同,修改脚本中switch(col)的匹配项
  • 如需替换换行分隔符,将join("\n")改为join("; ")等其他符号
  • 若分组逻辑不是连续行,可根据订单号等唯一标识调整判断条件

内容的提问来源于stack exchange,提问作者Gaurav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:26:15