将行从一个选项卡复制和删除到另一个选项卡
Copy and delete rows from one tab to another
我发布此消息是因为我的 google 脚本代码有问题。
我的 sheet 中有两个选项卡:
- 第一个是我的数据库,里面有我所有的记录
- 第二个是存档,应该包含我要存档的第一个选项卡的数据(复选框等于 true)
选中一些框后,我 运行 我的脚本必须复制存档选项卡中选中框的行,然后在数据库选项卡中删除同一行。
如果我只选中一个框,一切都会完美无缺。但是,当有多个选择时,并没有删除正确的。
示例:
要删除的第 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;
}
我发布此消息是因为我的 google 脚本代码有问题。
我的 sheet 中有两个选项卡:
- 第一个是我的数据库,里面有我所有的记录
- 第二个是存档,应该包含我要存档的第一个选项卡的数据(复选框等于 true)
选中一些框后,我 运行 我的脚本必须复制存档选项卡中选中框的行,然后在数据库选项卡中删除同一行。 如果我只选中一个框,一切都会完美无缺。但是,当有多个选择时,并没有删除正确的。
示例:
要删除的第 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;
}