deleteRow基于另一张相同电子表格的单元格编辑

时间:2015-04-19 18:18:38

标签: google-apps-script google-sheets google-spreadsheet-api

我有什么
一个名为“脚本测试”的谷歌电子表格,其中两张名为“删除”和“非删除”。

我需要什么
如果通过下拉菜单将“非删除”中的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

2 个答案:

答案 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)

在测试过滤功能几分钟后,我几乎可以做到我需要做的事情。不管怎样,谢谢!