Как писать в ячейку при заданном диапазоне с триггером onFormSubmit? (Скрипт приложений Google) - PullRequest
0 голосов
/ 07 августа 2020

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

В этом случае я хочу проверить, является ли первая буква имени заглавной, и если это не так, я хочу заменить его исправленной версией (то же имя, только первая буква заглавная).

Этот код возвращает ошибку при попытке запустить его в редакторе (не удается прочитать свойство "диапазон" не определен.) Я предполагаю, что это связано с тем, что он использует триггер onFormSubmit, поэтому единственный способ проверить его - это фактически отправить ответ формы.

функция запускается, похоже, она ничего не делает в конце таблицы. Новые ячейки, содержащие имя и фамилию (или любую из новых ячеек, если на то пошло), просто не изменяются, с заглавными буквами или без них.

При использовании отдельной функции, которая относится к ячейки таким же образом (взяв диапазон вновь представленных ячеек и обозначив их строкой [numberhere] внутри for l oop), он прекрасно читает их строки.

function caseCheck(r) {
  var range = r.range;
  var data1 = range.getValue();
  for (var r in data1) {
    var row1 = data1[r];
    var firstName = row1[2].getValue;
    var lastName = row1[3].getValue;
    var firstNameC = firstName[0].toUpperCase();
    var lastNameC = lastName[0].toUpperCase();

    if (firstName[0] != firstNameC) {
      var firstNameL = firstName.length();
      var firstNameSS = firstName.substring(1,firstNameL);
      var firstNameCorrected = firstNameC + firstNameSS;
      row1[2].setValue(firstNameCorrected);
    }

    if (lastName[0] != lastNameC) {
      var lastNameL = lastName.length();
      var lastNameSS = lastName.substring(1,lastNameL);
      var lastNameCorrected = lastNameC + lastNameSS;
      row1[3].setValue(lastNameCorrected);
    }
  }
}

1 Ответ

2 голосов
/ 07 августа 2020

У вас есть несколько проблем с кодом, как показано.

Я думаю, вы хотели использовать множественное число range.getValues() не range.getValue(), поскольку .getValue просто возвращает объект внутри верхней левой ячейки диапазона . Если data1 - строка, тогда for (var r in data1) просто перебирает строку, а не массив значений.

Предполагая, что вы исправили data1, чтобы это был массив массивов, тогда row1 это просто массив JavaScript, предположительно массив строк, поэтому различные места, где вы используете, например, row1[2].getValue (в любом случае, без скобок) и row1[2].setValue(firstNameCorrected) не должны иметь никакого эффекта, потому что это строки, не Range объектов.

Что вам нужно сделать, так это изменить массив данных по мере необходимости, а затем вызвать range.setValues(data) с измененными данными.

function caseCheck(r) {
  var range = r.range;
  var data = range.getValues();
  for (var r in data) {
    var row = data[r];
    // do whatever mutation to row you want
  }
  range.setValues(data);
}

В качестве примечания , личные предпочтения / предложения, такой императивный изменяющийся код очень трудно читать и поддерживать. Попробуйте использовать больше (и меньше) функций ...

function caseCheck(r) {
  var range = r.range;
  var data = range.getValues();
  var newData = data.map(rowCapitalizeFunction);
  range.setValues(newData);
}

function rowCapitalizeFunction(row) {
  var firstName = row[2];
  // etc ... do what you need to do
  return [/* send back a new array with new values, much easier to understand! */];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...