将行从一个选项卡复制和删除到另一个选项卡

Copy and delete rows from one tab to another

我发布此消息是因为我的 google 脚本代码有问题。

我的 sheet 中有两个选项卡:

选中一些框后,我 运行 我的脚本必须复制存档选项卡中选中框的行,然后在数据库选项卡中删除同一行。 如果我只选中一个框,一切都会完美无缺。但是,当有多个选择时,并没有删除正确的。

示例:

要删除的第 1 行和第 5 行 → 删除第 1 行和第 4 行。

我 运行 一个 console.log 看看我的错误是从哪里来的,但我不得不说我被卡住了。 一定不会太多,但如果有人有几分钟的时间给我他们的意见,我是一个接受者。

Here 是我 Sheet 的 link。

提前感谢您的反馈。

-- 编辑 1 --- 这是代码:

function archivage(){
   // Déclaration des constantes
   const classeur = SpreadsheetApp.getActiveSpreadsheet();
   const feuilleBDD = classeur.getSheetByName("bdd");
   const feuilleArchivage = classeur.getSheetByName("archive");

   // Récupération de l'ensemble des données
   var rangeDonnees = feuilleBDD.getRange("A2:D").getValues();

   // Récupération du nombre d'enregistrements
   var idEnregistrements = feuilleBDD.getRange("A2:A").getValues();
   var nbEnregistrements = idEnregistrements.filter(Number).length;

   for (let i =0; i < nbEnregistrements; i ++){
     // Récupération de la première ligne vide dans l'onglet "Archivage" et Création des coordonnées
     if (rangeDonnees[i][3]== true){
       var ligneVide = feuilleArchivage.getLastRow()+1;
       var coordLigneVide = "A"+ligneVide+":C"+ligneVide;
       var coordRangeACopier = "A"+ (2+i)+":C"+ (2+i);
       var coordDelete = 2 + i;
       // Récopiage des données dans l'onglet "Archivage"
       var range = feuilleBDD.getRange(coordRangeACopier);
       range.copyTo(feuilleArchivage.getRange(coordLigneVide));
       feuilleArchivage.getRange(coordLigneVide).setBackgroundRGB(255,255,255).setVerticalAlignment("middle").setHorizontalAlignment("center");
       Logger.log(coordDelete);
       feuilleBDD.deleteRow(coordDelete); 
     } else {
       continue;
     }
   }
 }

您需要跟踪删除的行数,因为当您删除行时,它下面的行的行号会发生变化,但数据的索引不会改变,所以我通常使用这样的删除计数器:

let startRow = "row where data starts";
let d = 0;
data.forEach((r,i)  => {
  if('conditional logic is in here to determine which lines') {
    sheet.deleteRow(i + startRow - d++);//the d++ deletes and then increments the delete counter after the operation
  }
})

感谢 Cooper 为寻找解决方案做出的贡献。有效!

这是我添加了增量器的新代码部分:

 var d = 0;
 for (let i =0; i < nbEnregistrements; i ++){
   // Récupération de la première ligne vide dans l'onglet "Archivage" et Création des coordonnées
   if (rangeDonnees[i][3]== true){
     var ligneVide = feuilleArchivage.getLastRow()+1;
     var coordLigneVide = "A"+ligneVide+":D"+ligneVide;
     var coordRangeACopier = "A"+ (2+i-d)+":D"+ (2+i-d);
     var coordDelete = 2 + i;
  
     // Recopiage des données dans l'onglet "Archivage"
     var range = feuilleBDD.getRange(coordRangeACopier);
     range.copyTo(feuilleArchivage.getRange(coordLigneVide));
     feuilleArchivage.getRange(coordLigneVide).setBackgroundRGB(255,255,255).setVerticalAlignment("middle").setHorizontalAlignment("center");
     feuilleBDD.deleteRow(coordDelete - d);
     d = d+1;
  }