我最近发现有人在他们的网站上发布了一些代码,这些代码根据行中的某一列是否被选中来在工作表之间来回移动项目。我刚刚更改了一些内容,例如对选中列的引用和列数。
我对编写此 Apps 脚本代码不太了解。我试着把头埋进去,但我迷失了。我知道问题在于它试图获取不存在的行。或者至少这就是我认为的问题所在。但是,有时当我将复选标记添加到中间的行时,它会移动该行以及接触它的行(我不记得它是上面还是下面的行)。有时该行完全消失并且不会移动到另一张纸。有时,它会移动到另一张工作表,但其中没有复选标记,此时该工作表中没有复选标记的项目应移回主工作表。很奇怪。
下面是我遇到的错误,下面是代码。任何帮助将不胜感激。
function onEdit() {
var mainSheet = "To Do";
var sheetToMoveTheRow = "Completed";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = SpreadsheetApp.getActiveRange();
if(sheet.getName() == "To Do" && range.getColumn() == 1 && range.getValue() == true) {
var row = range.getRow();
var numColumns = sheet.getLastColumn();
var targetSheet = ss.getSheetByName("Completed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
sheet.getRange(row, 1, 1, numColumns).moveTo(target);
sheet.deleteRow(row);}
else if(sheet.getName() == "Completed" && range.getColumn() == 1 && range.getValue() == false) {
var row = range.getRow();
var numColumns = sheet.getLastColumn();
var targetSheet = ss.getSheetByName("To Do");
const aVals = targetSheet.getRange(1,1,targetSheet.getLastRow(),1).getValues();
const targetRow = aVals.filter(String).length + 1;
var target = targetSheet.getRange(targetRow , 1);
sheet.getRange(row, 1, 1, numColumns).moveTo(target);
sheet.deleteRow(row);}
}
我尝试更改代码中的一些变量。抱歉,我不知道正确的术语。我更改了几个不同的 getRange 调用中的值,但没有运气。
包含的内容使用保留的函数名称来实现简单的触发器。但是,屏幕截图显示了可安装触发器上的错误的部分或电子邮件消息。由此可见,您已经设置了一个可安装的触发器来调用 onEdit 函数;这会导致 onEdit 函数运行两次,并且可能是问题的一部分。
首先,您应该决定是否希望通过简单触发器或可安装触发器来调用此函数。如果您将使用简单触发器,则删除可安装触发器。如果您决定采用其他方式,请更改函数名称并相应更新可安装的触发器。