我有一个脚本可以将行移动到另一张纸上,它可以工作,但并不完全如我所愿。
我有一个带有 2 个选项卡的 SpreadSheet,一个是“A PLANFIER”,一个是“MASTER”。 在选项卡“A PLANIFIER”中,B 列中的值可以是 OUI 或 NON,要移动的行是值为 OUI 的行。 列 B、D、F 到 U、V 到 AB 和 AE 从“A PLANFIER”到 H、J、L 到 AA、AM 到 AS 和 BL 分别从“MASTER”。
我用 moveTo() 函数修改了 SputnikDrunk2 回复中的脚本,该函数效果很好,因为它还可以传输评论,但缺点是它会弄乱目标工作表的条件格式。所以我使用了 copyTo() 函数,它也很好用,但这里的缺点是没有导入注释。
我用 setComment() 和 getComment() 尝试了几种解决方案,但我真的做不到。
有人可以帮我理解我的错误吗?
我的表格 在脚本项目中,名称为:Transfet Client Planifié.gs
我的剧本:
function transferData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("A PLANIFIER");
var targetSheet = ss.getSheetByName("MASTER");
// Retrieve the sheet row numbers with 'OUI' data & place in an array
var ouiData = sourceSheet.getDataRange().getValues().map((x, i) => [i + 1, x[1]]).filter(x => x[1] == 'OUI');
// Get the next empty row from the target sheet [reference: https://stackoverflow.com/a/56080850/15384825]
var targetSheetNextRow = targetSheet.getRange(1, 8).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow() + 1;
ouiData.forEach(y => {
var row = y[0];
sourceSheet.getRange("B" + row).copyTo(targetSheet.getRange("H" + targetSheetNextRow), {contentsOnly:true});
sourceSheet.getRange("D" + row).copyTo(targetSheet.getRange("J" + targetSheetNextRow), {contentsOnly:true});
sourceSheet.getRange("F" + row + ":U" + row).copyTo(targetSheet.getRange("L" + targetSheetNextRow + ":AA" + targetSheetNextRow), {contentsOnly:true});
sourceSheet.getRange("V" + row + ":AB" + row).copyTo(targetSheet.getRange("AM" + targetSheetNextRow + ":AS" + targetSheetNextRow), {contentsOnly:true});
sourceSheet.getRange("AE" + row).copyTo(targetSheet.getRange("BL" + targetSheetNextRow), {contentsOnly:true});
// Delete transferred values from source sheet
sourceSheet.getRange("B" + row + ":AE" + row).clearContent();
// Update the next empty row on the target sheet
targetSheetNextRow = targetSheetNextRow + 1;
}
)
sortM();
sortAP();
}
注意:请注意,我们不会为您编写代码,但您可以使用下面这个经过调整的脚本来指导您进行实际项目。
检查您的脚本后,您的 loop 在第一行数据之后中断,因此它只移动一行。也许您可以在下面测试这个经过调整的脚本,它专门将
A PLANIFIER
上的工作表行与“OUI”数据收集到一个数组中,并通过 forEach()
循环遍历它。我在脚本上添加了一些评论以获得更多上下文。
我仍然使用您的原始逻辑,因为如果使用不同的方法(也假设您已经构建了多个脚本文件),它似乎会破坏您的整个设置和工作表的格式。最后,使用
moveTo()
复制笔记更容易,代码行更少,但运行速度会受到影响。
function transferData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("A PLANIFIER");
var targetSheet = ss.getSheetByName("MASTER");
// Retrieve the sheet row numbers with 'OUI' data & place in an array
var ouiData = sourceSheet.getDataRange().getValues().map((x, i) => [i + 1, x[1]]).filter(x => x[1] == 'OUI');
// Get the next empty row from the target sheet [reference: https://stackoverflow.com/a/56080850/15384825]
var targetSheetNextRow = targetSheet.getRange(1, 8).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow() + 1;
ouiData.forEach(y => {
var row = y[0];
sourceSheet.getRange("B" + row).moveTo(targetSheet.getRange("H" + targetSheetNextRow));
sourceSheet.getRange("D" + row).moveTo(targetSheet.getRange("J" + targetSheetNextRow));
sourceSheet.getRange("F" + row + ":U" + row).moveTo(targetSheet.getRange("L" + targetSheetNextRow + ":AA" + targetSheetNextRow));
sourceSheet.getRange("V" + row + ":AB" + row).moveTo(targetSheet.getRange("AM" + targetSheetNextRow + ":AS" + targetSheetNextRow));
sourceSheet.getRange("AE" + row).moveTo(targetSheet.getRange("BL" + targetSheetNextRow));
// Update the next empty row on the target sheet
targetSheetNextRow = targetSheetNextRow + 1;
// Keep the format of the source line
var rng = sourceSheet.getRange("A50:AG50")
rng.copyTo(sourceSheet.getRange("A6:AG50" + row), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
}
)
sortM();
sortAP();
}