У меня есть кусок кода, который работает, но очень неэффективно.Возможно, это можно улучшить, но я не понимаю, как работает «возврат» - PullRequest
0 голосов
/ 07 февраля 2019

Я собрал воедино код, который захватывает строку из активной ячейки и перебирает ее в диапазоне, пока не найдет совпадение, а затем возвращает соседнюю ячейку.Он работает так, как я хочу, но он немного медленный, и журнал показывает, что скрипт возвращает значение соседней ячейки примерно в 30 раз (я думаю, столько, сколько существует).Поскольку я собираюсь увеличить диапазон позже, эта задержка может оказаться проблемой.

Я на 90% уверен, что вы можете это исправить, просто зная, как работает оператор return (я вставил Returnоператор, а затем журнал выглядел правильно, но я понятия не имел, как на самом деле установить значение из этого оператора возврата)

//------ Step 1: Take value in activecell assuming it is in column 2 and below row 3.

function onEdit () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var database = ss.getSheetByName("Database");
  var lists = ss.getSheetByName("Studentinfo");
  var activeCell = database.getActiveCell();

  if (activeCell.getColumn() == 2 && activeCell.getRow() >3) {

    var activeStudent = activeCell.getValue();
    Logger.log(activeStudent)
  }

//------ Step 2: Search lists for value of activeStudent & store value

  var row = lists.getRange(4, 1,lists.getLastRow(),2).getValues();

  for (var i = 0; i<row.length;i++) {

    if (row[i][1] == activeStudent)
// here is probably where Return row[i][0] should be?
    var studentClass = row[i][0];
    Logger.log(studentClass)
      }

//------ Step 3: Take the value and set it to activeCell offset (0,-1)

  activeCell.offset(0,-1).setValue(studentClass); 


}

1 Ответ

0 голосов
/ 08 февраля 2019

Если ваша идея состоит в том, чтобы прекратить выполнение сценария после того, как совпадение было найдено, тогда у вас есть два варианта:

  1. Да, просто вернуть что-то, как только вы найдете совпадение:
for (var i = 0; i < row.length; i++) {
    if (row[i][1] == activeStudent) {
        var studentClass = row[i][0];
        Logger.log(studentClass);
        activeCell.offset(0,-1).setValue(studentClass); 
        return studentClass;
    }
}

Вызывая return, вы даете возможность ссылаться на значение, вычисленное вашей функцией onEdit, где-то еще, например var studentClass = onEdit();.

Поскольку return завершает работу вашей функции, вам необходимо установить значения в электронной таблице перед ее вызовом.

Дополнительная информация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Поскольку я не думаю, что это так, вы можете разорвать ваш цикл, как только получите совпадение:
for (var i = 0; i < row.length; i++) {
    if (row[i][1] == activeStudent) {
        var studentClass = row[i][0];
        Logger.log(studentClass);
        break;
    }
}

break заставляет функцию завершить цикл в любой заданной точкене дожидаясь пока все элементы будут итерированы, но он не завершит саму функцию, поэтому вы можете установить свои значения вне цикла.

Подробнее: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/break

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...