Ошибка ссылки на элемент массива - PullRequest
0 голосов
/ 28 мая 2018

Это должен быть действительно простой скрипт, который меняет заголовок столбца между 3 столбцами.Я заставил его работать один раз, но теперь он выдает ошибку, которую я не понимаю:

ReferenceError: «Сегодня» не определено.(строка 10, файл «Код»)

Код выглядит следующим образом:

function Progressions() {
  var workoutSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Workouts");

  var Increment = workoutSheet.getRange(2, 1, 1, 3).getValues();
  var newRoutine =[[]]

  if (Increment == [[Today,,]]){ 
    var newRoutine = [[ ,Today, ]]
    Increment.setValues(newRoutine);
  } else {
    if (Increment == [[,Today,]]){ 
      var newToday = [[,,Today]]
      Increment.setValues(newRoutine);
    } else {
      if (Increment == [[,,Today]]){ 
        var newToday = [[Today,,]]
        Increment.setValues(newRoutine);
      }
    }
  }

Очевидно, что Сегодня не определяется, поскольку это просто содержимое массива.Я думаю, что этот скрипт должен просто изменить содержимое массива newToday и затем ввести его в диапазон todayIncrement.

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

1 Ответ

0 голосов
/ 28 мая 2018

Есть несколько причин, по которым ваш код не работает, например «Сегодня», но также в ваших массивах с вашим вызовом .getValues(); возвращаемый массив будет выглядеть примерно так: [["","Today",""]]

Вы не можетеиспользуйте Increment.setValues(------);, поскольку increment - это массив, а не объект диапазона.

Должен быть создан оператор if

if(-----){

} else if (-----) {

} else {

}

Этот код выполняет то, что вам требуется:

function Progressions() {
    var workoutSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Workouts");
    var range = workoutSheet.getRange(2, 1, 1, 3);
    var increment = range.getValues();

    var newRoutine;
    var testValue = "Today";

    if (increment[0][0] == testValue) {
        newRoutine = [["", "Today", ""]];
    } else if (increment[0][1] == testValue) {
        newRoutine = [["", "", "Today"]];
    } else if (increment[0][2] == testValue) {
        newRoutine = [["Today", "", ""]];
    }
    range.setValues(newRoutine);
}

Альтернативная реализация цепочки if-else, которую проще расширять (например, если у вас было 365 различных тренировок в виде столбцов, вышеуказанному методу требуется 365 if - else проверок), за счет необходимости большегоЗнание JavaScript, чтобы понять, как это работает:

function Progressions() {
  const workoutSheet = SpreadsheetApp.getActive().getSheetByName("Workouts"),
      // 1 column per workout (here we have 3).
      headerRange = workoutSheet.getRange(2, 1, 1, 3),
      // Assume headers are in the range's first row.
      headers = headerRange.getValues()[0],
      newRoutine = [];

  // Use Array#indexOf to do all the nasty "if-else if" checking.
  const searchValue = "Today";
  const columnIndex = headers.indexOf(searchValue);
  if (columnIndex === -1)
    throw new Error("'" + searchValue + "' not found in headers ('" + headerRange.getA1Notation() + "').");

  // Set default header values (no Array#fill in Apps Script yet).
  headers.forEach(function (s) { newRoutine.push(""); });

  // Use addition and the modulus operator to increment and wrap.
  const newIndex = (columnIndex + 1) % newRoutine.length;
  newRoutine[newIndex] = searchValue;

  // Write the new header values.
  headerRange.setValues( [newRoutine] );
}
...