Автоматическая вставка строки выше, основанная на значении одной ячейки - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь автоматически вставить строку над текущей верхней строкой (строка 2) на основе значения ячейки.

spreadsheet picture

Я не могу понять, какие переменные мне нужныположить в редактор сценариев.

Я попытался найти помощь и изменил сценарий других людей, чтобы посмотреть, смогу ли я это сделать, и ответ - нет, нет, я не обладаю знаниями / навыками.

function conditionalNewRow() {
  var ss = SpreadsheetApp.getActive().getSheetByName('NEW INV');
  var sh = ss.getActiveSheet();
  var headerRow = 1;
  var firstRow = headerRow + 1;
  var range = sh.getRange("A2"); // Get range of row 2.
  var futureRange = sh.getRange("A3"); // Get range of row 3.
  var numCols = range.getNumColumns(); // Get the number of columns for row 2.
  var contentVal = false;

  for (i = 1; i <= numCols; i++) {
    var currentValue = range.getCell(1,i).getValue();
    if (currentValue == "NO"){
      contentVal = true;
      break;
    }
  }  
  if (contentVal == true) {
    sh.insertRowBefore(firstRow); // Insert an empty row into row 2.       
    futureRange.copyTo(sh.getRange(firstRow, 1, firstRow, numCols), {contentsOnly:false}); // Copy row 3 to row 2.
  }
}

Все, что я хочу, это пустая строка над предыдущей строкой, когда ячейка соответствует определенным критериям;

например, ячейка A2 содержит любое из следующего;YES, NO, LOADED, UNLOADED

Если оно содержит любое из этих значений, оно автоматически вставит строку выше.

1 Ответ

1 голос
/ 18 июня 2019

Мне немного непонятно, каковы ваши намерения и какие у вас проблемы.

Несколько вещей, которые я вижу:

1) Поскольку ваш диапазон - одна ячейка, var numCols = range.getNumColumns(); следуетвсегда возвращайте 1, поэтому ваш цикл for (i = 1; i <= numCols; i++) должен выполняться ровно один раз.Такое ощущение, что здесь много избыточного кода.

Чтобы получить значение ячейки A2, вы можете просто написать:

var range = sh.getRange("A2");
var currentValue = range.getValue();

2) Из операторов if этопохоже, что вы хотите добавить новую строку, только если значение A2 отличается от «НЕТ».Это верно?(Это не то, что говорит ваш вопрос).Если это так, я думаю, вы довольно близки с оператором sh.insertRowBefore(firstRow);, просто он может потеряться в какой-то запутанной логике.

3) Вы действительно хотите скопировать все из строки 3 в строку 2?В вопросе вы утверждаете: «Все, что я хочу, это пустая строка над предыдущей строкой, когда ячейка соответствует определенным критериям».

Возможно, что-то вроде этого ближе к тому, что вы хотите?

function conditionalNewRow() {
  var ss = SpreadsheetApp.getActive().getSheetByName("NEW INV");
  var sh = ss.getActiveSheet();

  var range = sh.getRange("A2"); // Get range of row 2.
  var currentValue = range.getValue();

  if (currentValue !== "NO") {
    sh.insertRowBefore(firstRow); // Insert an empty row into row 2.
  }
}

Редактировать

Из вашего комментария звучит так, будто вы хотите вставить новую строку всякий раз, когда A2 редактируется для одного из выбираемых значений.Вы можете проверить простых триггеров , таких как onEdit, которые запускаются всякий раз, когда ячейка редактируется.Например, что-то вроде этого:

/**
 * The event handler triggered when editing the spreadsheet.
 * @param {Event} e The onEdit event.
 */
function onEdit(e) {
  // get sheet
  var sheet = SpreadsheetApp.getActive().getSheetByName("NEW INV");

  // Get the edited range
  var editedRange = e.range;

  // check if cell A2 was edited
  if (editedRange.getA1Notation() === "A2") {
    // check if value is a desired value
    if (editedRange.getValue() === "YES" || "NO" || "LOADED" || "UNLOADED") {
      // if yes to both, insert new row
      sheet.insertRowBefore(2);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...