如何用Google Script/JavaScript将多列分隔字符串拆分为多行?
多列分号分隔字符串拆分适配方案
问题说明
- 需拆分的列:示例数据中为B(Authors)、C(Authors Raw Affiliation)、D(Corresponding Authors)、E(Authors Affiliations)列;实际数据中对应X、Y、AA、AB列
- 非拆分列(如ID、GRID IDs)需随拆分后的行重复保留
- 已能实现单列拆分,无法处理多列同步拆分场景
现有数据格式
| ID | Authors | Authors Raw Affiliation | Corresponding Authors | Authors Affiliations | GRID IDs |
|---|---|---|---|---|---|
| 1 | AAA; BBB; CCC | Stuff1; Stuff2; Stuf3 | oStuff1; oStuff2; oStuf3 | AAA, (University of Oxford); BBB (University of Bonn); CCC (University of Zurich) | QQQ1 |
| 2 | RRR; GGG | Stuff4; Stuff5 | oStuff4;oStuff5 | RRR, (University of Oxford); GGG(University of Bonn) | |
| 3 | MMM | Stuff6 | oStuff6 | MMM, (University of Cambridge) | QQQ3 |
期望拆分结果
| ID | Authors | Authors Raw Affiliation | Corresponding Authors | Authors Affiliations | GRID IDs |
|---|---|---|---|---|---|
| 1 | AAA | Stuff1 | oStuff1 | AAA, (University of Oxford) | QQQ1 |
| 1 | BBB | Stuff2 | oStuff2 | BBB (University of Bonn) | QQQ1 |
| 1 | CCC | Stuff3 | oStuff3 | CCC (University of Zurich) | QQQ1 |
| 2 | RRR | Stuff4 | oStuff4 | RRR, (University of Oxford) | |
| 2 | GGG | Stuff5 | oStuff5 | GGG(University of Bonn) | |
| 3 | MMM | Stuff6 | oStuff6 | MMM, (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
相关产品推荐
相关产品推荐

