脚本折叠数据透视表行失效:需手动折叠后方可生效
问题原因及解决方案
原脚本的问题在于:仅当透视表行已经存在valueMetadata属性(也就是手动折叠过的行)时,才会设置折叠状态;而默认展开的行没有这个属性,脚本直接跳过了处理。
需要修改的核心逻辑是:当行没有valueMetadata时,主动创建该数组,并为每一行分组项添加collapsed: true的配置。
修改后的完整代码:
function myFunction() { var sheetName = "Sheet1"; // 请设置你的工作表名称 var ss = SpreadsheetApp.getActiveSpreadsheet(); var ssId = ss.getId(); var sheet = ss.getSheetByName(sheetName); var sheetId = sheet.getSheetId(); // 获取透视表数据 var obj = Sheets.Spreadsheets.get(ssId, { ranges: [sheetName], fields: "sheets(data(rowData(values(pivotTable))))" }).sheets[0]; // 构建批量更新请求 var requests = obj.data[0].rowData.reduce((ar, r, i) => { if (r.values) { r.values.forEach((c, j) => { if (c.pivotTable) { var pivotTable = c.pivotTable; ["rows"].forEach(e => { // 若需同时折叠列,改为["rows", "columns"] if (pivotTable[e]) { pivotTable[e].forEach(pr => { // 关键修改:如果没有valueMetadata,主动创建并设置所有项为折叠 if (!pr.valueMetadata) { // 统计当前行分组的项数量,生成对应数量的valueMetadata元素 pr.valueMetadata = Array.from({ length: pr.values.length }, () => ({ collapsed: true })); } else { pr.valueMetadata.forEach(vm => vm.collapsed = true); } }); ar.push({ updateCells: { range: { sheetId, startRowIndex: i, endRowIndex: i + 1, startColumnIndex: j, endColumnIndex: j + 1 }, rows: [{ values: [{ pivotTable }] }], fields: "pivotTable" } }); } }); } }); } return ar; }, []); if (requests.length == 0) return; // 执行批量更新 Sheets.Spreadsheets.batchUpdate({ requests }, ssId); }
修改说明
- 新增了对
pr.valueMetadata不存在的判断,通过pr.values.length获取当前行分组的项数量,创建对应长度的valueMetadata数组,每个元素都设置collapsed: true。 - 确保无论是手动折叠过还是默认展开的行,都会被统一设置为折叠状态。
内容的提问来源于stack exchange,提问作者vk26
相关产品推荐
相关产品推荐

