我有一个跟踪设计师任务的 google 表格标签。
当设计师在第 7 列中将任务标记为“已完成”时,我希望将该行复制并粘贴到不同的选项卡。粘贴后,我希望清除原始复制的行。但是,我希望发送复制行的选项卡基于原始选项卡上的设置范围。这是因为我想在单独的选项卡上跟踪设计师完成的所有任务。由于我与 3 位设计师合作,因此我将有 3 个不同的已完成选项卡;或复制行的 3 个单独位置。
以下是我当前的代码:
function onEdit(event){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wst = ss.getSheetByName('Tasks');
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
//FOR CODE TO MOVE COMPLETED ROWS OF TASKS IN TASKS TAB TO STAFF COMPLETED TABS
taskstabtoCompleted(ss,s,r,wst);
//Tasks Tab-Moves Task Rows to Completed Task Tabs When Status is Completed
function taskstabtoCompleted(ss,s,r,wst){
if(s.getName() == "Tasks" && r.getColumn() == 7 && r.getValue() == "Completed") {
if (wst.getRange(3,1,9,7)){
var row = r.getRow();
var targetSheet = ss.getSheetByName("Designer 1 Completed Tasks");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, 7).copyTo(target);
var clearRange = s.getRange(row,1,1,7);
clearRange.clearContent();
}
else if (wst.getRange(14,1,9,7)){
var row = r.getRow();
var targetSheet = ss.getSheetByName("Designer 2 Completed Tasks");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, 7).copyTo(target);
var clearRange = s.getRange(row,1,1,7);
clearRange.clearContent();
}
else
var row = r.getRow();
var targetSheet = ss.getSheetByName("Designer 3 Completed Tasks");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, 7).copyTo(target);
var clearRange = s.getRange(row,1,1,7);
clearRange.clearContent();
}
}
现在代码根本不起作用。我已经通过稍微调整它来复制该行,但是无论它在原始选项卡上的什么位置,它都会被发送到提到的第一个选项卡。
任何帮助将不胜感激!让我知道是否需要进一步解释自己。
您的脚本根据行号将数据复制到三张纸中的一张。
这个答案更多地使用了Event Objects。
if
语句#1 与 OP 相同
if else if
语句来检查行号是否落在每个设计师的值之间。function onEdit(event){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet2Watch = 'Tasks'
if(event.range.getSheet().getName() == sheet2Watch && event.range.columnStart == 7 && event.value == "Completed") {
if ((row >= dRows[0][0]) && (row <=dRows[0][1])){ // designer1
var targetSheetName = "Designer 1 Completed Tasks"
}
else if ((row >= dRows[1][0]) && (row <=dRows[1][1])) { // designer 2
var targetSheetName = "Designer 2 Completed Tasks"
}
else if((row >= dRows[2][0]) && (row <=dRows[2][1])){ // designer 3
var targetSheetName = "Designer 2 Completed Tasks"
}
else {
return
}
var targetSheet = ss.getSheetByName(targetSheetName)
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1)
var sourceSheet = ss.getSheetByName(sheet2Watch)
sourceSheet.getRange(event.range.rowStart, 1, 1, 7).copyTo(target);
var clearRange = sourceSheet.getRange(event.range.rowStart,1,1,7);
clearRange.clearContent();
}
}
我相信你的目标如下。
在你的情况下,下面的示例脚本怎么样?
当我看到你的脚本时,我认为事件对象可能可以得到更多的利用。而且,当一个对象用于搜索目标工作表名称时,我认为脚本可能会变得简单。所以,我想提出以下示例脚本。
请将以下脚本复制并粘贴到电子表格的脚本编辑器中并保存脚本。
function onEdit(e) {
// This condition is from your reply.
const obj = {
"3-11": "Designer 1 Completed Tasks",
"14-22": "Designer 2 Completed Tasks",
"25-33": "Designer 3 Completed Tasks",
};
const { range, source, value } = e;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Tasks" || range.columnStart != 7 || value != "Completed") return;
const o = Object.entries(obj).find(([k]) => {
const [start, end] = k.split("-");
return range.rowStart >= Number(start) && range.rowStart <= Number(end);
});
if (!o) return;
const r = range.offset(0, -6, 1, 7);
const dstSheet = source.getSheetByName(o[1]);
r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1), { contentsOnly: true });
r.clearContent();
}
Completed
时,运行此脚本。根据行号,该行被复制到目标工作表的最后一行。并且,行值被清除。s.getRange(row, 1, 1, 7).copyTo(target);
,如果要复制带有样式和下拉列表的行值,请将r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1), { contentsOnly: true });
修改为r.copyTo(dstSheet.getRange(dstSheet.getLastRow() + 1, 1));
。