deleteRow 基于对相同传播 sheet 的另一个 sheet 的单元格编辑
deleteRow based off cell edit on another sheet of same spreadsheet
我有什么
一个 google 传播sheet 命名为 "Script Test" 与两个 sheets 命名为 "delete" 和 "non delete".
我需要什么
如果 "non delete" 上的 Col B 中的一行通过下拉菜单中,"delete" 上具有相同购买编号的行将被删除。
我尝试了什么
有效方法 = 通过研究堆栈,我发现了一个 onEdit 函数,它根据单元格是否具有特定值来删除 "delete" 上的一行。在本例中,该值为 'DELETE'。问题是,如果该单元格位于 sheet "delete" 而不是 sheet "non delete",我只能让它工作。如果我正在 "non delete" 工作并需要返回 "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);
}
}
什么没用 = 我稍微修改了脚本,让它在 "delete" 上读取 Col F,在 Col F 中,我在 [=55= 中有 Col B 的索引匹配].但是,当 Col F 更改为 'DELETE' 时,这不会删除 "delete" 上的行。现在我不是 100% 同意这一点,但我几乎可以推断这是因为 Col F 不是 "edited",而是其中的公式是 "updating"。我也试过摆弄我在堆栈上找到的其他脚本,但 none 似乎让我和上面的脚本一样接近。
需要思考的事情
首先,感谢你们能给我的任何帮助。就在发布这个问题之前,我遇到了一个过滤功能,如果我对索引匹配的看法是正确的,我认为它可能是一个前进的方向。我找到了一个基于过滤器隐藏行的函数,但我需要删除该行,所以我假设这就像用 deleteRows 切换 hideRows 一样简单。我已经尝试添加我需要完成的屏幕截图,但我没有足够的声誉。如果有帮助,我可以并且会在 spreadsheet 的副本中添加 link。再次感谢您提供任何提示或指导。
Copy of Script Test
使用getSheetByName()
方法获取删除sheet.
function checkCellValue(argRowToDelete) {
if (e.value == 'DELETE') {
var toDeltSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("delete");
toDeltSheet.deleteRow(argRowToDelete);
}
}
如果你想要一个单独的函数来删除行,可以在主函数中检查 'DELETE' 文本,并将行号传递给删除函数:
我已经测试了以下代码,它可以工作。当下拉列表用于select 'DELETE' 时 'non delete' sheet, 删除'delete'sheet.
中对应的行
我对代码进行了多项更改。即使此代码删除了 sheet 中与编辑发生的位置不同的行,仍然存在潜在问题。一旦删除了“delete”sheet 中的一行,这些行就会移动。如果您开始删除顶部或中间的行,则删除行下方的每一行都不再与“delete”sheet.[=13= 中的行同步]
所以,这回答了你的问题,但现在你还有另一个问题。
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);
};
在测试过滤功能几分钟后,我几乎可以用它来完成我需要的工作。无论如何谢谢!
我有什么
一个 google 传播sheet 命名为 "Script Test" 与两个 sheets 命名为 "delete" 和 "non delete".
我需要什么
如果 "non delete" 上的 Col B 中的一行通过下拉菜单中,"delete" 上具有相同购买编号的行将被删除。
我尝试了什么
有效方法 = 通过研究堆栈,我发现了一个 onEdit 函数,它根据单元格是否具有特定值来删除 "delete" 上的一行。在本例中,该值为 'DELETE'。问题是,如果该单元格位于 sheet "delete" 而不是 sheet "non delete",我只能让它工作。如果我正在 "non delete" 工作并需要返回 "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);
}
}
什么没用 = 我稍微修改了脚本,让它在 "delete" 上读取 Col F,在 Col F 中,我在 [=55= 中有 Col B 的索引匹配].但是,当 Col F 更改为 'DELETE' 时,这不会删除 "delete" 上的行。现在我不是 100% 同意这一点,但我几乎可以推断这是因为 Col F 不是 "edited",而是其中的公式是 "updating"。我也试过摆弄我在堆栈上找到的其他脚本,但 none 似乎让我和上面的脚本一样接近。
需要思考的事情
首先,感谢你们能给我的任何帮助。就在发布这个问题之前,我遇到了一个过滤功能,如果我对索引匹配的看法是正确的,我认为它可能是一个前进的方向。我找到了一个基于过滤器隐藏行的函数,但我需要删除该行,所以我假设这就像用 deleteRows 切换 hideRows 一样简单。我已经尝试添加我需要完成的屏幕截图,但我没有足够的声誉。如果有帮助,我可以并且会在 spreadsheet 的副本中添加 link。再次感谢您提供任何提示或指导。
Copy of Script Test
使用getSheetByName()
方法获取删除sheet.
function checkCellValue(argRowToDelete) {
if (e.value == 'DELETE') {
var toDeltSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("delete");
toDeltSheet.deleteRow(argRowToDelete);
}
}
如果你想要一个单独的函数来删除行,可以在主函数中检查 'DELETE' 文本,并将行号传递给删除函数:
我已经测试了以下代码,它可以工作。当下拉列表用于select 'DELETE' 时 'non delete' sheet, 删除'delete'sheet.
中对应的行我对代码进行了多项更改。即使此代码删除了 sheet 中与编辑发生的位置不同的行,仍然存在潜在问题。一旦删除了“delete”sheet 中的一行,这些行就会移动。如果您开始删除顶部或中间的行,则删除行下方的每一行都不再与“delete”sheet.[=13= 中的行同步]
所以,这回答了你的问题,但现在你还有另一个问题。
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);
};
在测试过滤功能几分钟后,我几乎可以用它来完成我需要的工作。无论如何谢谢!