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

Posted

技术标签:

【中文标题】将行从一个选项卡复制并删除到另一个选项卡【英文标题】: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;
     
   
 

【问题讨论】:

您可能希望将相关代码分享给那些无法或不想访问工作表的人。 我在最初的帖子中添加了代码,抱歉我没有放在开头 【参考方案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;
  

【讨论】:

以上是关于将行从一个选项卡复制并删除到另一个选项卡的主要内容,如果未能解决你的问题,请参考以下文章

当我从一个选项卡单击到另一个选项卡时,如何使TabLayout中的选项卡不可滚动

在带有选项卡式控件的表单中,单击按钮会降低焦点选项卡页中的面板高度,如果移动到另一个选项卡并返回,则会更正

将数据从一个设计选项卡传递到另一个选项卡

将数据从一个选项卡控制器快速传递到另一个选项卡控制器

从一个选项卡滑动到另一个选项卡时,TabView 不保留状态

将 UIView 从一个选项卡移动到另一个选项卡