Google 表格脚本:使用一个单元格中的术语删除另一页上的一行
Google Sheets script: Using a term in one cell to delete a row on another page
我正在尝试找到一种方法,根据另一个 sheet 上的复选框选择的行,使用 onEdit 函数删除一个 sheet 上的行。
复选框位于 Sheet1 的 A 列中;该行是可变的,因为 Sheet1 是搜索页。唯一的搜索结果/搜索字符串在 B 列 中。我要从此搜索页面删除的记录在第二个 sheet、Sheet2 上。在 Sheet2 中,一些相同的数据是从 Sheet1 复制的,但没有复选框。因此,Sheet1 上 Column B 中的唯一标识符是 Sheet2 上的 Column A,这就是我希望删除发生的位置。在 Sheet2 中,A 列的值 总是 唯一,所以我认为这不需要数组。
因此,总而言之,此脚本会说:如果选中 Sheet1 上的一行,请查看该行中 B 列的值。然后,在 Sheet2 中搜索 A 列。如果匹配,则删除行。所以,我的问题是:这个脚本应该怎么写?
不过,有一个小问题,我不敢提,生怕这个问题会因为“没有重点”而面临终结。 (所以,如果你只想回答上面的问题而忽略这一点,那还是很棒的!)。我之所以这么问,是因为我觉得它首先会影响脚本的编码方式。我只希望在 Sheet1 上的 Column E 说 Indirect 时发生此删除。如果 E 列为 空白,或包含其他文本,则脚本运行如下:
function onEdit(e) {
if (e.range.columnStart != 1) return;
if (e.value != 'TRUE') return;
var sheet = SpreadsheetApp.getActive();
var ignored_sheets = ['Sheet2','Sheet3'];
if (ignored_sheets.includes(sheet.getName())) return;
if(e.range.getSheet().getRange(e.range.getRow(),5).getValue().length > 0){
sheet.toast("Can't overwrite data.");
sheet.getActiveCell().setValue(false);
return;};
var row_index = e.range.rowStart;
var row = sheet.getRange('B' + row_index + ':D' + row_index).getDisplayValues().flat();
if (row[1] == '') return;
var result = SpreadsheetApp.getUi()
.alert("Append record?", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
if (result != SpreadsheetApp.getUi().Button.OK) {
sheet.toast("Operation canceled.");
sheet.getActiveCell().setValue(false);
return;}
sheet.toast("Operation complete.");
sheet.getActiveCell().setValue(false);
sheet.getRange('B3').clearContent();
sheet.getSheetByName('Sheet2').appendRow(row);
sheet.getSheetByName('Sheet1').setActiveCell('B3');
}
根据您在评论中提到的问题陈述:-
The third function I want to add is the ability to delete records, if
their column E value is "Indirect"
示例脚本如下所示:-
function onEdit(e)
{
const value = e.value
const range = e.range
const sheet = range.getSheet();
const row = range.getRow();
const column = range.getColumn();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const checkValue = sheet.getRange(row, 5).getValue(); // Column E value
if(column === 1 && value == 'TRUE' && checkValue === 'Indirect')
{
const ref_IDtoSearch = sheet.getRange(row, 2).getValue(); // ref id in sheet 1
const targetSheet = ss.getSheetByName('Sheet2')
const refRange = targetSheet.getRange('A1:A').getValues().flat(); // Range ref column in sheet 2
const posRow = refRange.indexOf(ref_IDtoSearch)
if(posRow > -1)
{
targetSheet.deleteRow(posRow+1)
}
}
}
将其合并到您现有的 onEdit
代码中。
参考:
我正在尝试找到一种方法,根据另一个 sheet 上的复选框选择的行,使用 onEdit 函数删除一个 sheet 上的行。
复选框位于 Sheet1 的 A 列中;该行是可变的,因为 Sheet1 是搜索页。唯一的搜索结果/搜索字符串在 B 列 中。我要从此搜索页面删除的记录在第二个 sheet、Sheet2 上。在 Sheet2 中,一些相同的数据是从 Sheet1 复制的,但没有复选框。因此,Sheet1 上 Column B 中的唯一标识符是 Sheet2 上的 Column A,这就是我希望删除发生的位置。在 Sheet2 中,A 列的值 总是 唯一,所以我认为这不需要数组。
因此,总而言之,此脚本会说:如果选中 Sheet1 上的一行,请查看该行中 B 列的值。然后,在 Sheet2 中搜索 A 列。如果匹配,则删除行。所以,我的问题是:这个脚本应该怎么写?
不过,有一个小问题,我不敢提,生怕这个问题会因为“没有重点”而面临终结。 (所以,如果你只想回答上面的问题而忽略这一点,那还是很棒的!)。我之所以这么问,是因为我觉得它首先会影响脚本的编码方式。我只希望在 Sheet1 上的 Column E 说 Indirect 时发生此删除。如果 E 列为 空白,或包含其他文本,则脚本运行如下:
function onEdit(e) {
if (e.range.columnStart != 1) return;
if (e.value != 'TRUE') return;
var sheet = SpreadsheetApp.getActive();
var ignored_sheets = ['Sheet2','Sheet3'];
if (ignored_sheets.includes(sheet.getName())) return;
if(e.range.getSheet().getRange(e.range.getRow(),5).getValue().length > 0){
sheet.toast("Can't overwrite data.");
sheet.getActiveCell().setValue(false);
return;};
var row_index = e.range.rowStart;
var row = sheet.getRange('B' + row_index + ':D' + row_index).getDisplayValues().flat();
if (row[1] == '') return;
var result = SpreadsheetApp.getUi()
.alert("Append record?", SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
if (result != SpreadsheetApp.getUi().Button.OK) {
sheet.toast("Operation canceled.");
sheet.getActiveCell().setValue(false);
return;}
sheet.toast("Operation complete.");
sheet.getActiveCell().setValue(false);
sheet.getRange('B3').clearContent();
sheet.getSheetByName('Sheet2').appendRow(row);
sheet.getSheetByName('Sheet1').setActiveCell('B3');
}
根据您在评论中提到的问题陈述:-
The third function I want to add is the ability to delete records, if their column E value is "Indirect"
示例脚本如下所示:-
function onEdit(e)
{
const value = e.value
const range = e.range
const sheet = range.getSheet();
const row = range.getRow();
const column = range.getColumn();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const checkValue = sheet.getRange(row, 5).getValue(); // Column E value
if(column === 1 && value == 'TRUE' && checkValue === 'Indirect')
{
const ref_IDtoSearch = sheet.getRange(row, 2).getValue(); // ref id in sheet 1
const targetSheet = ss.getSheetByName('Sheet2')
const refRange = targetSheet.getRange('A1:A').getValues().flat(); // Range ref column in sheet 2
const posRow = refRange.indexOf(ref_IDtoSearch)
if(posRow > -1)
{
targetSheet.deleteRow(posRow+1)
}
}
}
将其合并到您现有的 onEdit
代码中。
参考: