我正在尝试使用Google表格和Apps脚本创建销售线索管理格式。
apps脚本正在检查工作表 Propsect 或 Interested 的 M 列中的值是否已更改,并根据该值移动排至相应的工作表(感兴趣,推迟,丢失或已预订)
该电子表格与我的团队共享,该团队将进行更改,并与多个用户同时进行编辑。
现在,问题在于,一旦触发两个onEdit
,并且如果两个都需要移动行,则第一个实例将正常运行,而第二个实例将删除错误的行。
例如:在工作表前景中,第2行和第3行的状态同时更改为Lost
和Postponed
。现在,Lost
被正确触发,但是,Postponed
实例删除了第四行(现在是第三行,因为之前删除了第二行)。
我尝试将lockservice
添加到代码中,以便仅运行一个实例,但这似乎无法解决问题,因为事件对象仍在考虑未更新的行号。
甚至尝试在代码的开头和结尾处添加flush()
,但是也没有用。
您可以访问电子表格here。
我的代码如下:
function Master(e) {
var lock = LockService.getScriptLock();
var SS = e.source;
var Sheet = e.source.getActiveSheet();
var Range = e.range;
if(Sheet.getName() == "Prospect" && Range.getColumn() == "13" || Sheet.getName() == "Interested" && Range.getColumn() == "13"){
moveRows(SS,Sheet,Range);
}
lock.releaseLock();
}
function moveRows(SS,Sheet,Range) {
var val1 = Sheet.getRange(Range.getRow(),1,1,10).getDisplayValues();
val1 = String(val1).split(",");
var tar_sheet = SpreadsheetApp.getActive().getSheetByName(Range.getValue());
var row = tar_sheet.getRange(tar_sheet.getLastRow()+1,1,1,val1.length).setValues([val1]);
Sheet.deleteRow(Range.getRow());
}
}
第二个onEdit
是否只有在第一个完成执行后才能运行?我想,如果发生这种情况,问题将会解决吗?
我希望我能够正确表达我的问题。
答案 0 :(得分:1)
传递到e
的事件对象onEdit(e)
不会改变,如果同时进行两个或更多编辑,并且第一个编辑会更改下一个编辑的行号,e.range.rowStart
在执行时,第二个以上的编辑不可靠。
请勿立即删除行。将其标记为删除(在属性服务中保存范围字符串),然后在不使用文档时将其删除(时间触发器)。
或者,添加代码保护:检查range.getValue()===e.value
。如果它们相等,则继续moveRows
,否则offset
将范围保持-1行,直到它们相等为止。
答案 1 :(得分:0)
我想您应该只基于用户交互触发一个功能,然后在内部执行条件操作。
类似这样的东西:
function onEdit(event_object) {
var sheet = event_object.range.getSheet();
var row = event_object.range.getRow();
var column = event_object.range.getColumn();
if (sheet.getName() == "Sheet1") {
// perform operations when Sheet1 is edited
} else if (sheet.getName() == "Sheet2") {
// perform operations when Sheet2 is edited
}
}
参考:
https://developers.google.com/apps-script/reference/spreadsheet/range
https://developers.google.com/apps-script/guides/triggers/events#edit