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 EIndirect 时发生此删除。如果 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 代码中。

参考:

deleteRow()