如何自动将源文件工作表的每行转置到目标文件工作表?
实现Google Sheets横向数据自动转置为纵向列的方案
同一文件内自动转置(无需手动下拉公式)
如果源数据和目标区域在同一个表格里,用数组公式可以一次性处理所有行,新增数据也会自动更新:
若要把源表
Sheet1中B3:H的所有横向行,统一转置成目标表的纵向单列(从B3开始),用公式:=ArrayFormula(FLATTEN(TRANSPOSE(Sheet1!B3:H)))TRANSPOSE先把整个源区域转置,FLATTEN将转置后的二维数组拆成连续的纵向列,自动覆盖所有行的转置结果。若要让源表每行的转置结果对应到目标表的固定纵向块(比如源第3行转
B3-B9,源第4行转B10-B16),用公式:=ArrayFormula(IFERROR(VLOOKUP(ROW(B3:B), {SEQUENCE(ROWS(Sheet1!B3:H),1,3)*7-18, FLATTEN(TRANSPOSE(Sheet1!B3:H))},2,FALSE)))这里通过
SEQUENCE计算每行转置后的起始行号,配合VLOOKUP让目标行号匹配对应转置数据。
跨文件自动转置(结合IMPORTRANGE)
如果源数据在另一个文件,先确保已授权IMPORTRANGE访问源文件,再用数组公式批量拉取并转置:
=ArrayFormula(FLATTEN(TRANSPOSE(IMPORTRANGE("你的源文件ID", "Sheet1!B3:H"))))
源文件新增行后,目标文件会自动同步并转置成纵向列,无需手动调整公式。
用Google Apps Script实现全自动化(适合复杂逻辑)
如果需要定时同步或自定义转置规则,写个脚本就能完全自动化:
function autoTranspose() { // 替换成你的源文件和目标文件ID const sourceFileId = "xxxxxxxxx"; const targetFileId = "yyyyyyyyy"; const sourceSheet = SpreadsheetApp.openById(sourceFileId).getSheetByName("Sheet1"); const targetSheet = SpreadsheetApp.openById(targetFileId).getSheetByName("Sheet1"); // 获取源表B3到最后一行的H列数据 const sourceData = sourceSheet.getRange("B3:H" + sourceSheet.getLastRow()).getValues(); let targetStartRow = 3; // 从目标表B3开始写入 sourceData.forEach(row => { // 转置当前行并写入目标列 const transposed = row.map(cell => [cell]); targetSheet.getRange(targetStartRow, 2, transposed.length, 1).setValues(transposed); targetStartRow += row.length; // 下一行转置结果接在当前块后面 }); }
写完脚本后,设置触发器(比如每天定时运行,或源文件编辑时触发),就能实现无人值守的自动转置。
内容的提问来源于stack exchange,提问作者Just Fair
相关产品推荐
相关产品推荐

