使用Google Apps Script将筛选后数组移至另一工作表
实现符合条件行的迁移与原表清空
以下是针对需求的完整实现方案,包含优化后的代码及关键逻辑说明:
function doPost(e) { var jsonString = e.postData.getDataAsString(); var event = JSON.parse(jsonString); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("Import"); var timeStamp = new Date(); var time = Utilities.formatDate(timeStamp, "GMT+1", "dd/MM/yyyy, h:mm a"); var nextRow = sheet.getLastRow() + 1; // 改用批量插入优化性能,替代单个setValue var newRow = [ time, "", // 第2列留空,与原逻辑保持一致 jsonString, event.data.amount, event.data.metadata.is_supplementary, event.data.reference ]; sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]); // 可选:每次Webhook更新后自动执行迁移,注释该行则需手动运行migrateSupplementaryRows migrateSupplementaryRows(); } function migrateSupplementaryRows() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sourceSheet = ss.getSheetByName("Import"); // 原数据工作表 var targetSheet = ss.getSheetByName("Supplementary"); // 目标工作表,需提前创建或修改名称 // 获取原表所有数据 var allRows = sourceSheet.getDataRange().getValues(); if (allRows.length <= 1) { Logger.log("原表仅含表头,无需迁移"); return; } // 分离表头与数据行 var dataRows = allRows.slice(1); // 筛选第5列(索引4)值为true的行 var filteredRows = dataRows.filter(row => row[4] === true); if (filteredRows.length === 0) { Logger.log("无符合条件的行需要迁移"); return; } // 将筛选行批量写入目标表 var targetNextRow = targetSheet.getLastRow() + 1; targetSheet.getRange(targetNextRow, 1, filteredRows.length, filteredRows[0].length).setValues(filteredRows); // 清空原表数据行,仅保留表头 var sourceDataRange = sourceSheet.getRange(2, 1, sourceSheet.getLastRow() - 1, sourceSheet.getLastColumn()); sourceDataRange.clearContent(); Logger.log(`成功迁移${filteredRows.length}行数据,原表已清空`); } // 保留原函数用于测试筛选结果 function getData() { var rows = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); var filteredRows = rows.filter(function(row){ var is_supplementary = row[4]; if (is_supplementary == true){ return row; } }); Logger.log(filteredRows); }
关键逻辑说明
- 性能优化:将
doPost中的多个setValue改为批量setValues,减少Google Apps Script API调用次数,提升执行效率 - 迁移逻辑:
- 分离原表的表头与数据行,避免表头被误迁移
- 精准筛选第5列值为
true的数据行 - 批量将筛选结果写入目标工作表的末尾
- 原表清空:仅清空第2行及以后的数据区域,确保表头完整保留
- 容错处理:增加判断逻辑,避免原表无数据、无符合条件行时的无效操作与报错
- 触发方式:默认在Webhook更新后自动执行迁移,若需手动触发,注释
doPost末尾的migrateSupplementaryRows()调用即可
内容的提问来源于stack exchange,提问作者RustyTones
相关产品推荐
相关产品推荐

