如何用Google Apps Script遍历表格列并自动切换提取重复表头数据
解决Google Apps Script多列数据转换问题
问题描述
需要从名为data的工作表提取数据,将每列的表头按其下方非空条目的数量重复,最终在filter工作表生成如下格式的结果:
| 姓名 | 科目 |
|---|---|
| Michael Lowry | Trigonometry |
| Michael Lowry | Biology |
| ... | ... |
当前代码仅能处理第一列,无法实现检测到当前列首个空单元格时自动切换到下一列循环处理的逻辑。
修正后的代码
function filter() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName("data"); const filterSheet = ss.getSheetByName("filter"); // 获取所有数据并清空目标工作表(保留表头) const data = dataSheet.getDataRange().getValues(); if (filterSheet.getLastRow() > 1) { filterSheet.getRange(2, 1, filterSheet.getLastRow() - 1, 2).clearContent(); } const result = []; // 遍历每一列(从第一列开始) for (let col = 0; col < data[0].length; col++) { const header = data[0][col]; if (!header) continue; // 跳过空表头的列 // 遍历当前列的行(从第二行开始) for (let row = 1; row < data.length; row++) { const value = data[row][col]; if (!value) break; // 遇到空单元格就停止当前列的处理 // 收集表头和对应条目 result.push([header, value]); } } // 批量写入结果到目标工作表,提高效率 if (result.length > 0) { filterSheet.getRange(2, 1, result.length, 2).setValues(result); } }
关键改动说明
- 双重循环逻辑:外层循环遍历所有列,内层循环处理当前列的行,遇到空单元格就终止当前列的遍历,自动切换到下一列。
- 批量写入优化:避免原代码逐单元格
setValue的低效操作,先将所有需要写入的数据存入数组,最后一次性用setValues写入,大幅提升运行速度。 - 空值判断:跳过空表头的列,同时在处理列内数据时,遇到空单元格立即停止,匹配需求中"检测前一列首个空单元格时切换列"的逻辑。
- 目标表清空处理:每次运行时先清空目标表的旧数据(保留表头行),避免数据重复堆积。
内容的提问来源于stack exchange,提问作者Ann Flow
相关产品推荐
相关产品推荐

