Перемещение строки в электронной таблице Google на основе 1 ячейки и проверка второй ячейки не пуста - PullRequest
0 голосов
/ 04 сентября 2018

Я довольно новичок в скриптах Google Sheets и пытаюсь изменить свой текущий скрипт, который перемещает строку из одного листа в другой в пределах одной и той же книги на основе значения "y" или "n" в столбце 20. Новый скрипт по-прежнему будет искать в столбце 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 голосов
/ 05 сентября 2018

Чтобы иметь решение «на основе активной ячейки», вам нужно воспользоваться параметром e события onEdit.

проверьте, является ли диапазон тем, который вы хотите проверить, затем проверьте, является ли значение правильным, а затем проверьте то же самое для другого диапазона (в данном случае столбец 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());
      }
    }
  }
}
0 голосов
/ 05 сентября 2018

Суть вашей проблемы в том, что вместо непосредственного получения диапазонов, на которые вы хотите посмотреть, вы используете активный диапазон (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 не имеет особого смысла - вы, вероятно, захотите r.isBlank(), если вы ищете столбец 19 пустым. Мой ответ отражает это, и вы должны изменить это условие, если я ошибаюсь.

Я также заметил, что ваши действия выглядят одинаково, независимо от того, находите ли вы «y» или «n» в столбце 20: в любом случае вы удаляете исходную строку и вставляете ее в «Reviewed 2018 2 Week Snapshot для Jim». " Мой ответ сохраняет различие, потому что я предполагаю, что есть и другие вещи, которые вы хотите сделать, условно увидев год.

В любом случае, это должно делать то, что, я думаю, вы пытаетесь сделать (обратите внимание на все предостережения?: 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(), если это так.

...