我有什么
一个名为“脚本测试”的谷歌电子表格,其中两张名为“删除”和“非删除”。
我需要什么
如果通过下拉菜单将“非删除”中的Col B中的行更改为“DELETE”,则具有相同Buy的行“删除”号码将被删除。
我做过什么
工作原理 =通过研究堆栈,我发现了一个onEdit函数,根据单元格是否具有特定值,删除“删除”行。在这种情况下,该值为“DELETE”。这个问题是,如果该单元格位于工作表“删除”而不是工作表“非删除”,我只能使它工作。如果我正在处理“非删除”并需要返回“删除”以删除一行信息,我可以右键单击行号并手动删除它。所以,这个剧本不一定能节省我的时间
该脚本如下:
function onEdit(e) {
try {
var ss = e.source;
var s = ss.getActiveSheet();
if (s.getName() == 'delete' &&
e.range.columnStart == 1 && e.range.columnEnd == 1 && // only look at edits happening in col A which is 1
e.range.rowStart == e.range.rowEnd ) { // only look at single row edits which will equal a single cell
checkCellValue(e);
}
} catch (error) { Logger.log(error); }
};
function checkCellValue(e) {
if (e.value == 'DELETE') {
e.source.getActiveSheet().deleteRow(e.range.rowStart);
}
}
什么没有用? =我在脚本上翻了一下,让它在“删除”中读取Col F,在Col F中,我在“非删除”中有一个Col B的索引匹配。但是,当Col F更改为“DELETE”时,这不会删除“删除”行。现在我不是百分之百,但我几乎可以推断出这种情况正在发生,因为Col F没有被“编辑”,而是内部的公式是“更新”。我也试过摆弄我在堆栈上找到的其他脚本,但似乎没有人像我上面的脚本那样接近。
需要考虑的事项
首先,感谢你们给我的任何帮助。就在发布这个问题之前,我遇到了一个过滤功能,如果我对索引匹配合适,我认为这可能是一个方向。我找到了一个基于过滤器隐藏行的函数,但我需要删除该行,所以我假设这与使用deleteRows切换hideRows一样简单。我已经尝试添加我需要做的截图,但我没有足够的声誉。如果有帮助,我可以并且将添加指向电子表格副本的链接。再次感谢任何提示或指导。
Copy of Script Test
答案 0 :(得分:0)
使用getSheetByName()
方法获取删除表。
function checkCellValue(argRowToDelete) {
if (e.value == 'DELETE') {
var toDeltSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("delete");
toDeltSheet.deleteRow(argRowToDelete);
}
}
如果你想要一个单独的函数来删除行,可以检查main函数中的'DELETE'文本,并将行号传递给delete函数:
我已经测试了以下代码,它确实有效。当下拉列表用于在“非删除”工作表中选择“删除”时,它会删除“删除中的相应行'表。
我对代码进行了多处更改。尽管此代码删除了与编辑发生位置不同的工作表中的行,但仍存在潜在问题。删除“删除”表格中的一行后,行将会移动。如果您开始删除顶部或中间的行,则已删除行下方的每一行都不会与“删除”表格中的行同步。
所以,这回答了你的问题,但现在又出现了另一个问题。
function onEdit(e) {
try {
var ss = e.source;
var s = ss.getActiveSheet();
var colStart = e.range.columnStart;
var colEnd = e.range.columnEnd;
Logger.log('colStart: ' + colStart);
Logger.log('colEnd: ' + colEnd);
var thisRow = e.range.getRow();
Logger.log('s: ' + s.getName());
//Avoid looking at multi column edits. If column start and column end is same column,
//then not a multi column edit
var editedFromNonDelete = (s.getName() === 'non delete');
Logger.log('editedFromNonDelete: ' + editedFromNonDelete);
var editedFromColB = (colEnd === 2) && (colStart === colEnd);
// only look at edits happening in col B
if (editedFromNonDelete && editedFromColB) {
Logger.log('e.value: ' + e.value);
if (e.value === 'DELETE') {
fncDeleteRow(thisRow);
};
}
} catch (error) {
Logger.log(error);
}
};
function fncDeleteRow(argRowToDelete) {
var toDeltSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("delete");
toDeltSheet.deleteRow(argRowToDelete);
};
答案 1 :(得分:0)
在测试过滤功能几分钟后,我几乎可以做到我需要做的事情。不管怎样,谢谢!