Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 在同一电子表格的另一张图纸上删除基于行的单元格外编辑_Google Apps Script_Google Sheets_Google Spreadsheet Api - Fatal编程技术网

Google apps script 在同一电子表格的另一张图纸上删除基于行的单元格外编辑

Google apps script 在同一电子表格的另一张图纸上删除基于行的单元格外编辑,google-apps-script,google-sheets,google-spreadsheet-api,Google Apps Script,Google Sheets,Google Spreadsheet Api,我有一个名为脚本测试的谷歌电子表格,有两个名为delete和nondelete的表格 如果通过下拉菜单将非删除栏B中的一行更改为“删除”,则删除栏B中具有相同购买编号的行 我试过的 What have work=通过研究堆栈,我发现了一个onEdit函数,该函数根据单元格是否具有特定值来删除delete中的一行。在本例中,该值为“DELETE”。问题是,只有当该单元格位于“工作表删除”而不是“工作表非删除”上时,我才能使其工作。如果我正在使用非删除功能,并且需要返回“删除”以删除一行信息,我可以

我有一个名为脚本测试的谷歌电子表格,有两个名为delete和nondelete的表格

如果通过下拉菜单将非删除栏B中的一行更改为“删除”,则删除栏B中具有相同购买编号的行

我试过的 What have work=通过研究堆栈,我发现了一个onEdit函数,该函数根据单元格是否具有特定值来删除delete中的一行。在本例中,该值为“DELETE”。问题是,只有当该单元格位于“工作表删除”而不是“工作表非删除”上时,我才能使其工作。如果我正在使用非删除功能,并且需要返回“删除”以删除一行信息,我可以右键单击行号并手动删除它。所以,这个脚本并不一定能帮我节省时间。 该脚本如下所示:

What has not worked=我稍微修改了一下脚本,让它在delete时读取F列,在F列中,我在non delete中有一个与B列的索引匹配。但是,当Col F更改为“delete”时,这不会删除delete上的行。现在我并不是百分之百的关注这个问题,但我可以推断这是因为F列没有被编辑,而是它里面的公式正在更新。我也尝试过摆弄在堆栈上找到的其他脚本,但似乎没有一个能像上面的脚本那样让我接近

要考虑的事情

首先,谢谢你们能给我的任何帮助。在发布这个问题之前,我遇到了一个过滤函数,如果我对索引匹配的看法是正确的,我认为它可能是一个方向。我发现了一个基于过滤器隐藏行的函数,但是我需要删除该行,所以我假设这就像用deleteRows切换hiderow一样简单。我试着添加我需要做的截图,但我没有足够的声誉。如果有帮助的话,我可以也将添加一个链接到电子表格的副本。再次感谢您的提示和指导。

使用getSheetByName方法获取删除工作表

如果您只需要一个单独的函数来删除行,可以在主函数中检查“删除”文本,并将行号传递给删除函数:

我已经测试了下面的代码,它是有效的。当下拉列表用于在“非删除”工作表中选择“删除”时,它将删除“删除”工作表中的相应行

我对代码做了多次更改。即使此代码删除工作表中与编辑位置不同的行,仍然存在潜在问题。删除“删除”工作表中的一行后,这些行将移动。如果开始删除顶部或中间的行,则已删除行下方的每一行不再与“删除”工作表中的行同步

这回答了你的问题,但现在你又遇到了另一个问题

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);
};

在测试了过滤函数几分钟之后,我已经基本上完成了我需要的工作。无论如何谢谢你

是的,所以那个新问题肯定是个问题。删除时的购买编号可能永远不会与非删除时的编号对齐,因此在删除时删除同一行是不好的。但是,你把我推向了我的最终目标,所以我真的很感激!我来看看我能摆弄什么。
function checkCellValue(argRowToDelete) {
  if (e.value == 'DELETE') {
    var toDeltSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("delete");
    toDeltSheet.deleteRow(argRowToDelete);
  }
}
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);
};