根据 1 个单元格在 google 电子表格中移动一行并验证第二个单元格不为空

Moving a row on google spreadsheet based on 1 cell and verifying second cell is not blank

我是 Google 表格脚本的新手,我正在尝试修改我当前的脚本,该脚本根据 [=14= 在同一工作簿中将行从一个 sheet 移动到另一个 "y" 或第 20 列中的 "n" 值。新脚本仍会查看第 20 列中的 "y" 或 "n",但我希望它也查看第 19 列以验证是否存在值那里。到目前为止,这是我的代码,但它不起作用:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = SpreadsheetApp.getActiveSheet();
  var r = SpreadsheetApp.getActiveRange();

  if (s.getName() == "2018 2 Week Snapshot for Jim"
      && r.getColumn() == 20
      && r.getValue() == "y") {
    if (s.getName() == "2018 2 Week Snapshot for Jim"
        && r.getColumn() == 19
        && r.getValue(r.isBlank()) == false) {
      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
      var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      s.getRange(row, 1, 1, numColumns).moveTo(target);
      s.deleteRow(row);
    }
  }
  if (s.getName() == "2018 2 Week Snapshot for Jim"
      && r.getColumn() == 20
      && r.getValue() == "n") {
    if(s.getName() == "2018 2 Week Snapshot for Jim"
        && r.getColumn() == 19
        && r.getValue(r.isBlank()) == false) {
      var row = r.getRow();
      var numColumns = s.getLastColumn();
      var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
      var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
      s.getRange(row, 1, 1, numColumns).moveTo(target);
      s.deleteRow(row);
    }
  }
}

问题的症结在于,您不是直接获取想要查看的范围,而是使用活动范围 (var r = SpreadsheetApp.getActiveRange();) 并在两个嵌套的 if 语句中进行检查,该范围是否同时在第 19 行和第 20 行, 该范围是否既为空白又包含某些内容("y" 或 "n")。换句话说,为了进入您的第一个代码块,必须满足以下条件:

s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 20
&& r.getValue() == "y") {
&& s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 19
&& r.getValue(r.isBlank()) == false

不用说这在逻辑上是有问题的:-)

顺便说一句,r.getValue(r.isBlank()) == false 没有多大意义——如果您希望第 19 列为空白,您可能需要 r.isBlank()。我的回答反映了这一点,如果我错了,你应该反转那个条件。

我还注意到,无论您在第 20 列中找到 "y" 还是 "n",您的操作看起来都是一样的:无论哪种情况,您都删除了原始行并将其粘贴到 "Reviewed 2018 2 Week Snapshot for Jim." 我的回答保留了区别,因为我假设你还想做其他事情,条件是看到 y/n.

无论如何,这应该可以完成我认为您正在尝试做的事情(注意到所有注意事项了吗?:D)

function onEdit() {
  var r = SpreadsheetApp.getActiveRange();  // The range being edited
  var s = r.getSheet();                     // Its sheet
  if (s.getName() != "2018 2 Week Snapshot for Jim") {
    // We're not editing the sheet we're interested in...
    return;
  }
  var activeRow = r.getRow();  // What row number are we on?
  var colNineteenNotBlank = !s.getRange(activeRow, 19).isBlank();  // Or did you need this *not* to be blank?
  var colTwentyValue = s.getRange(activeRow, 20).getValue();
  var numColumns = s.getLastColumn();
  var sourceRange = s.getRange(activeRow,    // start this row
                               1,            // start column 1 (A)
                               1,            // range should be 1 row
                               numColumns);  // range should be this many columns
  var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1,
                                         1,
                                         1,
                                         numColumns);
  if (colTwentyValue == "y" && colNineteenNotBlank) {
    sourceRange.moveTo(targetRange);
  } else if (colTwentyValue == "n" && colNineteenNotBlank) {
    // maybe you wanted something else here?
    sourceRange.moveTo(targetRange);
  }
}

这仍然不是防弹的;如果目标 sheet 填满,我不确定从 sheet 的 "end" 中获取范围是否可行。如果这很常见,我会检查 targetSheet.getMaxRow()targetSheet.getLastRow() 是否匹配,如果匹配则执行 targetSheet.appendRow()

要获得 "based-on active cell" 解决方案,您需要利用 onEdit 事件的 e 参数。

检查范围是否是您要测试的范围,然后测试值是否正确,然后检查另一个范围(在本例中为 S 列)的相同内容。

勾选moveTo目标电子表格范围后,您将删除移动的行。

代码会做这样的事情:

function onEdit(e)
{
  if (e.range.getColumn() == 20)
  {
    if(e.value == "Y" || e.value == "N" || e.value == "y" || e.value == "n" )
    {
      var val = e.source.getActiveSheet().getRange("S" + e.range.getRow()).getValue();
      if (val == "Y" || val == "y" || val == "N" || val == "n")
      {
        var destSheetName = "Reviewed 2018 2 Week Snapshot for Jim";
        var destSheet = e.source.getSheetByName(destSheetName);
        e.source.getActiveSheet().getRange(e.range.getRow(), 1, 1, e.source.getActiveSheet().getLastColumn()).moveTo(destSheet.getRange(destSheet.getLastRow() + 1 , 1, 1, e.source.getActiveSheet().getLastColumn()));
        e.source.getActiveSheet().deleteRow(e.range.getRow());
      }
    }
  }
}