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

如何用Google Script/JavaScript将多列分隔字符串拆分为多行?

多列分号分隔字符串拆分适配方案

问题说明

  • 需拆分的列:示例数据中为B(Authors)、C(Authors Raw Affiliation)、D(Corresponding Authors)、E(Authors Affiliations)列;实际数据中对应X、Y、AA、AB列
  • 非拆分列(如ID、GRID IDs)需随拆分后的行重复保留
  • 已能实现单列拆分,无法处理多列同步拆分场景

现有数据格式

IDAuthorsAuthors Raw AffiliationCorresponding AuthorsAuthors AffiliationsGRID IDs
1AAA; BBB; CCCStuff1; Stuff2; Stuf3oStuff1; oStuff2; oStuf3AAA, (University of Oxford); BBB (University of Bonn); CCC (University of Zurich)QQQ1
2RRR; GGGStuff4; Stuff5oStuff4;oStuff5RRR, (University of Oxford); GGG(University of Bonn)
3MMMStuff6oStuff6MMM, (University of Cambridge)QQQ3

期望拆分结果

IDAuthorsAuthors Raw AffiliationCorresponding AuthorsAuthors AffiliationsGRID IDs
1AAAStuff1oStuff1AAA, (University of Oxford)QQQ1
1BBBStuff2oStuff2BBB (University of Bonn)QQQ1
1CCCStuff3oStuff3CCC (University of Zurich)QQQ1
2RRRStuff4oStuff4RRR, (University of Oxford)
2GGGStuff5oStuff5GGG(University of Bonn)
3MMMStuff6oStuff6MMM, (University of Cambridge)QQQ3

适配后的代码

function splitMultiColumns() {
  // 配置参数
  const srcSheetName = "Sheet1"; // 源数据工作表名称
  const dstSheetName = "Sheet2"; // 输出结果工作表名称
  const splitColumnIndices = [1, 2, 3, 4]; // 需要拆分的列索引(从0开始计数,示例对应B-E列;实际数据X/Y/AA/AB列对应索引为23/24/26/27)
  const delimiter = ";"; // 分隔符
  const trimWhitespace = true; // 是否去除拆分后内容的首尾空格

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const dstSheet = ss.getSheetByName(dstSheetName);
  if (!srcSheet || !dstSheet) {
    throw new Error("源表或目标表不存在,请检查工作表名称");
  }

  // 获取所有数据(包含表头)
  const values = srcSheet.getDataRange().getValues();
  const [header, ...rows] = values;
  const result = [header]; // 保留表头

  rows.forEach(row => {
    // 拆分指定列的数据
    const splitArrays = splitColumnIndices.map(idx => {
      const cellValue = row[idx] || "";
      let parts = cellValue.split(delimiter);
      if (trimWhitespace) {
        parts = parts.map(part => part.trim());
      }
      // 过滤空字符串(避免分隔符连续导致空项)
      return parts.filter(part => part !== "");
    });

    // 确保所有拆分后的数组长度一致(以最长的为准)
    const maxLength = Math.max(...splitArrays.map(arr => arr.length));
    const normalizedArrays = splitArrays.map(arr => {
      if (arr.length < maxLength) {
        // 如果长度不足,补空字符串
        return arr.concat(Array(maxLength - arr.length).fill(""));
      }
      return arr;
    });

    // 生成拆分后的每一行
    for (let i = 0; i < maxLength; i++) {
      const newRow = [...row];
      splitColumnIndices.forEach((colIdx, arrIdx) => {
        newRow[colIdx] = normalizedArrays[arrIdx][i];
      });
      result.push(newRow);
    }
  });

  // 清空目标表并写入结果
  dstSheet.clearContents();
  dstSheet.getRange(1, 1, result.length, result[0].length).setValues(result);
}

代码说明

  • 参数配置:根据实际数据修改splitColumnIndices(注意列索引从0开始计数,比如实际数据的X列对应索引23)、工作表名称等参数
  • 核心逻辑:遍历每一行数据,拆分指定列的字符串,将所有拆分后的数组统一长度,再为每个索引生成新行,替换对应列内容,非拆分列保持原数据
  • 数据处理:自动去除拆分内容的首尾空格,过滤分隔符连续导致的空项,确保结果整洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:50:25