Google Apps Script跨工作表匹配数据按指定范围反序复制实现求助
问题解决代码&实现思路
核心修正点
- 原代码仅匹配了第一条符合条件的行,修正后会筛选所有匹配宠物名称的行
- 新增反序取最新15条的逻辑,适配从新到旧的粘贴要求
- 新增目标区域旧数据清空逻辑,避免残留历史数据
- 替换了原代码中错误的范围取值写法,直接赋值性能更稳定
完整可运行代码
function get15lastRowsBDvisitasToFichaMascota() { const libro = SpreadsheetApp.getActiveSpreadsheet(); const hojaOrigen = libro.getSheetByName('BD visitas'); const hojaDestino = libro.getSheetByName('Ficha mascota'); // 1. 获取目标宠物名称,为空直接退出 const nombreVisor = hojaDestino.getRange('D18').getValue().trim(); if (!nombreVisor) return; // 2. 获取源表有效数据,无有效数据直接退出 const lastRowOrigen = hojaOrigen.getLastRow(); if (lastRowOrigen < 7) return; const tablaDeBusquedaNombre = hojaOrigen.getRange('B7:I' + lastRowOrigen).getValues(); // 3. 筛选所有匹配宠物名的行,提取需要的列值 const matchedRows = []; tablaDeBusquedaNombre.forEach(row => { if (row[0]?.trim() === nombreVisor) { matchedRows.push([ row[1], // 源C列:日期 row[5], // 源G列:就诊原因 row[6], // 源H列:症状 row[7] // 源I列:备注 ]); } }); // 4. 反序得到从新到旧的排列,截取最新15条 const sortedMatched = matchedRows.reverse().slice(0, 15); // 5. 清空目标区域旧数据 hojaDestino.getRangeList(['C39:C53', 'D39:D53', 'G39:G53', 'M39:M53']).clearContent(); // 6. 按要求填充数据,最新记录放在第39行,依次往后排列 sortedMatched.forEach((rowData, index) => { const targetRow = 39 + index; hojaDestino.getRange(`C${targetRow}`).setValue(rowData[0]); hojaDestino.getRange(`D${targetRow}`).setValue(rowData[1]); hojaDestino.getRange(`G${targetRow}`).setValue(rowData[2]); hojaDestino.getRange(`M${targetRow}`).setValue(rowData[3]); }); }
关键逻辑说明
- 数据筛选:遍历源工作表B列所有有效数据,提取出所有与目标宠物名称匹配的行,同时把需要的C、G、H、I列值存入数组
- 排序截取:因为源工作表行号越大数据越新,所以先将筛选得到的数组反转,得到从新到旧的顺序,再截取前15条
- 数据填充:先清空目标工作表39-53行对应列的旧数据,再按顺序将最新的记录放在第39行,依次往后排列,不足15条的部分自动留空
内容的提问来源于stack exchange,提问作者Nerea
相关产品推荐
相关产品推荐

