如何在Google Apps Script中删除'Terminé'行后的两行数据
问题描述
我有如下二维数组PLANNING_3D_RESP:
var PLANNING_3D_RESP = [ ['Scénographie', true, true, true, true, 'Terminé', true, 'durée projet'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAT'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAP'], ['Plan tactile', false, false, false, false, 'En cours', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAT'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAP'], ['Maquette tactile bâtiment', false, false, false, false, 'Terminé', true, 'durée projet'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAT'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAP'] ]
需求是:当某行第6个元素(索引5)为"Terminé"时,删除该行之后的两行数据,最终得到目标数组:
var PLANNING_3D_RESP = [ ['Scénographie', true, true, true, true, 'Terminé', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'En cours', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAT'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAP'], ['Maquette tactile bâtiment', false, false, false, false, 'Terminé', true, 'durée projet'], ]
我尝试用filter方法但没找到思路,写了下面的代码却无法实现需求,请问这段代码有什么问题?
function myFunction() { var PLANNING_3D_RESP = [ ['Scénographie', true, true, true, true, 'Terminé', true, 'durée projet'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAT'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAP'], ['Plan tactile', false, false, false, false, 'En cours', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAT'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAP'], ['Maquette tactile bâtiment', false, false, false, false, 'Terminé', true, 'durée projet'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAT'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAP'] ] var PLANNING_3D_CLEAN = PLANNING_3D_RESP; for (let i = 0; i < PLANNING_3D_CLEAN.length; i++) { if (PLANNING_3D_RESP[i][5] == "Terminé") { PLANNING_3D_RESP.filter(i => 1 + i); PLANNING_3D_RESP.filter(i => 2 + i); } } Logger.log (PLANNING_3D_RESP) Logger.log (PLANNING_3D_CLEAN) }
代码问题分析
你的代码存在三个核心问题:
- 数组引用赋值无效:
var PLANNING_3D_CLEAN = PLANNING_3D_RESP;只是让两个变量指向同一个数组,没有创建副本,且后续代码完全没利用这个变量做有效操作。 filter方法完全误用:filter是返回新数组的纯方法,不会修改原数组,你直接调用却不接收返回值,等于白执行。- 回调函数
i => 1 + i逻辑错误,filter需要返回布尔值判断是否保留元素,这里的数值会被转为true,等于保留所有元素,根本达不到删除后续两行的目的。
- 循环逻辑漏洞:即使正确删除元素,正向循环会因为数组长度变化导致索引错乱,比如删除元素后后续元素前移,循环会跳过部分内容。
正确实现方案
方法1:构建新数组(推荐,不修改原数组)
通过标记需要跳过的行数,遍历原数组筛选出符合要求的元素:
function myFunction() { var PLANNING_3D_RESP = [ ['Scénographie', true, true, true, true, 'Terminé', true, 'durée projet'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAT'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAP'], ['Plan tactile', false, false, false, false, 'En cours', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAT'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAP'], ['Maquette tactile bâtiment', false, false, false, false, 'Terminé', true, 'durée projet'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAT'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAP'] ]; var PLANNING_3D_CLEAN = []; let skipCount = 0; for (let i = 0; i < PLANNING_3D_RESP.length; i++) { if (skipCount > 0) { skipCount--; continue; } const currentRow = PLANNING_3D_RESP[i]; PLANNING_3D_CLEAN.push(currentRow); // 遇到Terminé,标记后续2行跳过 if (currentRow[5] === "Terminé") { skipCount = 2; } } Logger.log(PLANNING_3D_CLEAN); }
方法2:直接修改原数组(反向遍历)
如果需要直接修改原数组,用反向遍历避免索引错乱:
function myFunction() { var PLANNING_3D_RESP = [ ['Scénographie', true, true, true, true, 'Terminé', true, 'durée projet'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAT'], ['Scénographie', true, true, true, true, 'BK', true, 'date BAP'], ['Plan tactile', false, false, false, false, 'En cours', true, 'durée projet'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAT'], ['Plan tactile', false, false, false, false, 'BK', true, 'date BAP'], ['Maquette tactile bâtiment', false, false, false, false, 'Terminé', true, 'durée projet'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAT'], ['Maquette tactile bâtiment', false, false, false, false, 'BK', true, 'date BAP'] ]; // 反向遍历,删除Terminé行之后的两行 for (let i = PLANNING_3D_RESP.length - 1; i >= 0; i--) { if (i >= 2 && PLANNING_3D_RESP[i-2][5] === "Terminé") { PLANNING_3D_RESP.splice(i, 1); } } Logger.log(PLANNING_3D_RESP); }
内容的提问来源于stack exchange,提问作者emilianoSala
相关产品推荐
相关产品推荐

