如何在Google Sheets中实现表格逆透视(Unpivot)?求Apps Script/Query方案
解决方法
方法一:使用Google Sheets Query函数
假设你的源数据在A1:D区域(A列为名称,B/C/D为独立属性列),可以用数组拼接+Query的方式直接转换:
=QUERY({ A2:A, "属性1", B2:B; A2:A, "属性2", C2:C; A2:A, "属性3", D2:D }, "select Col1, Col2, Col3 where Col3 is not null", 0)
原理说明:
- 用
{}将三部分数据拼接:每部分都是「名称列 + 属性类型标识 + 对应属性列」 - 通过
Query过滤掉属性值为空的行,最后输出整理后的结构
方法二:使用Google Apps Script
如果需要更灵活的处理(比如动态适配列数、自动更新),可以用脚本实现:
function transformTable() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sourceSheet = ss.getSheetByName("原表"); // 替换为你的源工作表名称 const targetSheet = ss.getSheetByName("目标表"); // 替换为你的目标工作表名称 const sourceData = sourceSheet.getDataRange().getValues(); const resultData = [["名称", "属性类型", "属性值"]]; // 目标表头,按需修改 // 遍历源数据行(跳过表头行) for (let i = 1; i < sourceData.length; i++) { const row = sourceData[i]; const name = row[0]; // 定义属性类型与对应列的映射,可根据实际列数扩展 const attrMap = [ ["属性1", row[1]], ["属性2", row[2]], ["属性3", row[3]] ]; // 逐个处理属性,跳过空值 attrMap.forEach(([type, value]) => { if (value !== "") { resultData.push([name, type, value]); } }); } // 写入目标表 targetSheet.clearContents(); targetSheet.getRange(1, 1, resultData.length, resultData[0].length).setValues(resultData); }
使用步骤:
- 打开你的Google表格,点击「扩展程序」→「Apps脚本」
- 粘贴上述代码,修改
sourceSheet和targetSheet的名称为你的实际工作表名 - 保存并运行脚本,授权后即可完成转换
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

