Google Sheets脚本跨表复制数据的三类问题求助
解决方案
以下是修正后的代码,可直接解决你提到的三类问题:
function fill_planning_data_sheet() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const COsheet = ss.getSheetByName('1_Test-CONCEPTION 2D/3D'); const PLsheet = ss.getSheetByName('02'); // 写入表头 PLsheet.getRange('G1:L1').setValues([['2D PROJECT','2D TASK', '2D NAME', '2D START D', "2D DD", '2D PROGRESS']]); // 获取原表有效数据范围,避免包含空行 const COdataRange = COsheet.getDataRange(); const COvalues = COdataRange.getValues(); // 过滤出有任务的有效行,第9列对应任务列,数组索引为8 const validTaskRows = COvalues.slice(1).filter(row => row[8] !== ''); const validRowCount = validTaskRows.length; if (validRowCount === 0) return; // 无有效任务时直接退出 // 1. 项目列:提取项目名,重复填充到所有有效任务行 const projectName = COvalues[1][0]; // 取第2行第1列的项目名 const projectColumn = Array(validRowCount).fill([projectName]); PLsheet.getRange(2, 7, validRowCount, 1).setValues(projectColumn); // 2. 复制任务列,仅复制值,不含公式 COsheet.getRange(2, 9, validRowCount, 1).copyTo(PLsheet.getRange(2, 8), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); // 3. 复制姓名列,仅复制值 COsheet.getRange(2, 10, validRowCount, 1).copyTo(PLsheet.getRange(2, 9), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); // 4. 填充起始日期,仅覆盖有效任务行 const startDateColumn = Array(validRowCount).fill(['01/01/2023']); PLsheet.getRange(2, 10, validRowCount, 1).setValues(startDateColumn); // 5. 复制Date BAT列,仅复制值 COsheet.getRange(2, 11, validRowCount, 1).copyTo(PLsheet.getRange(2, 11), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); // 6. 复制进度列,仅复制值 COsheet.getRange(2, 12, validRowCount, 1).copyTo(PLsheet.getRange(2, 12), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); }
问题解决细节说明
1. 项目列公式复制&重复填充问题
- 使用
SpreadsheetApp.CopyPasteType.PASTE_VALUES参数强制复制单元格值,避免带出公式 - 通过
Array(validRowCount).fill([projectName])生成与有效任务行数匹配的项目名数组,批量写入目标列,实现项目名随任务行重复填充
2. 起始日期冗余填充问题
- 先过滤原表中任务列为空的行,得到有效任务行数
- 仅针对有效行数的范围填充起始日期,不会覆盖大量空行
3. 项目列未完整填充问题
- 抛弃
getMaxRows()(会包含所有空行),改用有效任务行数作为写入范围的依据,确保每一行有效任务都对应项目名
内容的提问来源于stack exchange,提问作者antho2B
相关产品推荐
相关产品推荐

