在Google电子表格上基于1个单元格移动一行并确认第二个单元格不为空

时间:2018-09-04 19:41:32

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

我对Google表格的脚本还很陌生,因此我尝试修改当前脚本,根据第20列中的“ y”或“ 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);
    }
  }
}

2 个答案:

答案 0 :(得分:0)

问题的症结在于,您不是直接获取要查看的范围,而是使用活动范围(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”,您的操作看起来都是相同的:无论哪种情况,您都将删除原始行并将其粘贴到“ Jim的2018年回顾2周快照”中。 ”我的回答保留了区别,因为我认为还有其他条件要看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);
  }
}

这仍然不是防弹的;如果目标工作表已满,我不确定在工作表的“结束”范围之外进行调整是否可行。如果很常见,我会检查targetSheet.getMaxRow()targetSheet.getLastRow()是否匹配,如果匹配,请执行targetSheet.appendRow()

答案 1 :(得分:0)

要拥有“基于活动单元”的解决方案,您需要利用onEdit事件的MySQL docs参数。

检查范围是否是您要测试的范围,然后测试值是否正确,然后检查其他范围(在此情况下为列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());
      }
    }
  }
}