如何解决如何改进我的脚本以在Google Apps脚本中拖动多个单元格?
我这里有一个Google脚本,该脚本将行从一张纸发送到另一张纸,然后根据单元格值删除源行。目的是将旧任务发送到单独的电子表格(即,从“任务列表”标签到“已归档任务列表”标签),以防止一张纸过分拥挤。
当我将状态(第5列)更改为“存档”时,我拥有的代码成功运行,但是当我尝试一次更改多行(即向下拖动或复制)时,脚本仅适用于一行。我想我必须创建某种循环来解决此问题,但是我是脚本的新手,因此对此的任何帮助都将很棒!
这是我到目前为止的代码:
function onEdit(event) {
// assumes source data in sheet named Task List
// target sheet of move to named Archive Task List
// test column with "Archive" is col5
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Task List" && r.getColumn() == 5 && r.getValue() == "Archive") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Archive Task List");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1,1);
s.getRange(row,1,numColumns).moveTo(target);
s.deleteRow(row);
}
}
更新: 我已经实现了建议的代码更改,并且该脚本对于单行编辑仍然可以正常工作,但是,如果我一次执行2次或更多次编辑,则循环会将某些行超出所选范围进行归档。例如,如果我复制所有带有条目“ Archive”的F16:F19单元格并粘贴到col5中。 我更新的代码是:
function onEdit(event) {
// assumes source data in sheet named Task List
// target sheet of move to named Archive Task List
// test column with "Archive" is col5
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Task List" && r.getColumn() == 5 && r.getValue() == "Archive") {
var row = r.getRow();
var lastRow = r.getLastRow(); //Save the last edited row index
var numColumns = s.getLastColumn();
var numRows = lastRow - row == 0? 1: lastRow - row; // numRows has to be at least 1 =,this is in case of a single-line row.
var targetSheet = ss.getSheetByName("Archive Task List");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1,1);
//s.getRange(row,numColumns).moveTo(target);
s.getRange(row,numRows,numColumns).moveTo(target); // Take in account the lastRow when archiving the edited range.
//s.deleteRow(row);
for (let i = row; i<=lastRow; i++) {
s.deleteRow(i);
console.log(`Deleted row ${i}`);
}
}
}
解决方法
注意事项
在当前脚本中,您只能使用已编辑范围的第一行:
var row = r.getRow();
。这就是为什么只需要多行编辑范围的第一行的原因。要解决此问题,您应该考虑编辑范围的最后一行,可以使用 var lastRow = r.getLastRow();
轻松获得它。
请牢记这一点,我建议对您的脚本进行以下修改:
解决方案
第一:
var row = r.getRow();
var lastRow = r.getLastRow(); //Save the last edited row index
第二个(已编辑):
获取整个已编辑行的正确语法:getRange(row,column,numRows,numColumns)
var numRows = lastRow-row + 1; // Corrected this calculation
s.getRange(row,1,numColumns).moveTo(target); // Take in account the lastRow when archiving the edited range.
第三(已编辑):
删除所有存档的行:
for (let i = row; i<=lastRow; i++) {
s.deleteRow(row); // The row deletion will slide up all the other rows so the next row to delete will have always the same index
console.log(`Deleted row ${row} at pass number ${i}`);
}
这是一个循环操作,用于循环编辑范围内的行。
参考文献
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。