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

请求编写Google Apps Script拆分Google Form多组响应为独立行

Google Apps Script 拆分表单响应为多行数据

需求场景

你的Google Form结构如下:

  • 第1部分:仅日期输入项
  • 第2至13部分:每组包含Colour、Size、Age、City、Another? [是/否],选「是」进入下一组,选「否」提交表单

提交后的响应会存入Responses工作表,列是重复的字段(比如Colour 1、Size 1...Colour 12、Size 12),未填写的组对应列为空。需要将每组有效(非空)的Colour/Size/Age/City数据拆分为独立行,每行保留提交的Timestamp和Date,并追加到新的Data工作表中。

实现脚本

打开Google表格,点击「扩展程序」→「Apps脚本」,粘贴以下代码:

function splitFormResponses() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const responsesSheet = ss.getSheetByName("Responses");
  const dataSheet = ss.getSheetByName("Data") || ss.insertSheet("Data");
  
  // 初始化Data表头(如果不存在)
  if (dataSheet.getLastRow() === 0) {
    dataSheet.appendRow(["Timestamp", "Date", "Colour", "Size", "Age", "City"]);
  }
  
  const responsesData = responsesSheet.getDataRange().getValues();
  const headerRow = responsesData[0];
  const processedCol = headerRow.indexOf("已处理") === -1 ? 
    responsesSheet.getLastColumn() + 1 : headerRow.indexOf("已处理") + 1;
  
  // 遍历每一条提交记录(跳过表头)
  for (let i = 1; i < responsesData.length; i++) {
    const row = responsesData[i];
    const timestamp = row[0];
    const date = row[1];
    const isProcessed = row[processedCol - 1];
    
    // 跳过已处理的记录
    if (isProcessed) continue;
    
    // 处理12组重复字段(第2到13部分)
    const newRows = [];
    for (let group = 1; group <= 12; group++) {
      // 定位当前组的列索引(假设表头命名为"Colour 1"、"Size 1"等)
      const colourCol = headerRow.indexOf(`Colour ${group}`);
      const sizeCol = headerRow.indexOf(`Size ${group}`);
      const ageCol = headerRow.indexOf(`Age ${group}`);
      const cityCol = headerRow.indexOf(`City ${group}`);
      
      // 如果列不存在,跳过当前组
      if (colourCol === -1) break;
      
      const colour = row[colourCol];
      // 以Colour为空判断是否为无效组
      if (!colour) continue;
      
      // 组装新行数据
      newRows.push([
        timestamp,
        date,
        colour,
        row[sizeCol] || "",
        row[ageCol] || "",
        row[cityCol] || ""
      ]);
    }
    
    // 将有效数据追加到Data表
    if (newRows.length > 0) {
      dataSheet.getRange(dataSheet.getLastRow() + 1, 1, newRows.length, newRows[0].length).setValues(newRows);
    }
    
    // 标记当前记录为已处理,避免重复运行时重复处理
    responsesSheet.getRange(i + 1, processedCol).setValue("是");
  }
  
  // 如果是首次添加"已处理"列,设置表头
  if (headerRow.indexOf("已处理") === -1) {
    responsesSheet.getRange(1, processedCol).setValue("已处理");
  }
  
  SpreadsheetApp.getUi().alert("数据拆分完成!");
}

关键说明

  1. 表头命名匹配:脚本假设Responses表的表头是Timestamp、Date、Colour 1、Size 1...Colour 12、Size 12这样的格式,如果你的表头命名不同,需要修改indexOf里的字符串(比如如果是「颜色 1」就改成"颜色 1")。
  2. 重复处理防护:脚本会在Responses表新增「已处理」列,标记已处理的记录,避免重复运行时重复拆分数据。
  3. 有效组判断:脚本以Colour字段是否为空作为判断组是否有效的依据,你可以根据需求改成其他字段(比如Size)。
  4. 自动创建Data表:如果Data表不存在,脚本会自动创建并添加表头。

使用方法

  1. 保存脚本,命名为SplitFormResponses
  2. 点击脚本编辑器的运行按钮,首次运行需要授权权限
  3. 运行完成后,查看Data表即可看到拆分后的多行数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:48:14