【问题标题】:Copy and delete rows from one tab to another将行从一个选项卡复制并删除到另一个选项卡
【发布时间】:2021-11-04 12:06:45
【问题描述】:

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

我的工作表中有两个标签:

  • 第一个是包含我所有记录的数据库
  • 第二个是存档,应该包含我要存档的第一个选项卡的数据(其中复选框等于 true)

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

例子:

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

我运行了一个 console.log 来查看我的错误来自哪里,但我不得不说我被卡住了。 肯定不多,但如果有人有几分钟时间给我发表意见,我就是接受者。

Here是我的Sheet的链接。

提前感谢您的反馈。

-- 编辑 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;
     }
   }
 }

【问题讨论】:

  • 您可能希望将相关代码分享给那些无法或不想访问工作表的人。
  • 我在最初的帖子中添加了代码,抱歉我没有放在开头

标签: google-apps-script delete-row


【解决方案1】:

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

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
  }
})

【讨论】:

    【解决方案2】:

    感谢 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;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多