基于条件自动复制行至工作表:谷歌脚本仅返回最后一条记录问题排查
问题根源
你的脚本只保留最后一条符合条件记录的核心原因是:
Utlm_LinhaVistoria变量在函数外部初始化,值是固定的PlanVistoria.getLastRow()+1,循环中每次都往同一行写入数据,后续记录会覆盖之前的内容,最终只留下最后一条。- 另外你代码中写入了C列
sala[2],但需求是复制第1、2、4列,这里属于笔误。
修正后的代码
var plan = SpreadsheetApp.getActiveSpreadsheet(); const PlanVistoria = plan.getSheetByName("Vistoria"); const PlanObras = plan.getSheetByName("ListaObras"); function ClassificarEapagarLinha() { PlanObras.getRange("A2:H").sort({column:2, ascending: true}); } function PesquisarRecortarValoresColunaStatus() { // 每次执行时获取最新的行数据 const Ultm_LinhaObras = PlanObras.getLastRow(); const PlanPesquisa = PlanObras.getRange("B2:H"+Ultm_LinhaObras).getValues(); // 收集所有符合条件的记录 const dadosParaCopiar = []; for(var linha = 0 ; linha < PlanPesquisa.length; linha++){ if(PlanPesquisa[linha][6] == "OBRA CONCLUÍDA"){ // 按需求提取原行第1、2、4列(对应B、C、E列,数组索引0、1、3) const linhaDados = [PlanPesquisa[linha][0], PlanPesquisa[linha][1], PlanPesquisa[linha][3]]; dadosParaCopiar.push(linhaDados); } } // 一次性批量写入数据,避免重复操作单元格 if(dadosParaCopiar.length > 0){ const proximaLinhaVistoria = PlanVistoria.getLastRow() + 1; PlanVistoria.getRange(proximaLinhaVistoria, 1, dadosParaCopiar.length, dadosParaCopiar[0].length).setValues(dadosParaCopiar); } }
关键优化说明
- 将数据初始化逻辑移到函数内部,确保每次执行都获取表格最新状态
- 用数组批量收集符合条件的记录,避免循环中重复写入单元格(既解决覆盖问题,又提升执行效率)
- 写入前重新计算目标表的起始行,保证每条记录都写到新行
- 修正了列索引的笔误,严格匹配你"复制第1、2、4列"的需求
内容的提问来源于stack exchange,提问作者WesleyKmelo
相关产品推荐
相关产品推荐

