Объединение 3 функций onEdit

У меня есть 3 функции onEdit, я назвал их onEdit1(), onEdit2(), onEdit3(e) под основной функцией onEdit(e), но она не сработала, она работала с двумя функциями под ней, но когда я добавил третью последний} для основной функции остается красным, а функция выдает ошибку в диапазоне следующим образом: TypeError: Невозможно прочитать свойство "range" из неопределенного. (строка 93, файл "Код") в этой строке: if(e.range.getSheet().getName()!= 'Sheet1') return;

Вопрос: как заставить эти 3 функции onEdit работать вместе под одной функцией onEdit (e)?

1-й код: в этом случае создаются 2 идентичных листа, которые регистрируют каждое изменение в ячейке в списке sheetToWatch (Sheet1)

function onEdit1() {
  // This script records changes to the spreadsheet on a "Changelog" sheet.
  // The changelog includes these columns:
  // "Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"
  var sheetsToWatch = ['Sheet1', 'add more'];
  var changelogSheetName = "Changelog";
  var HelperSheetName = "Helper";
  var timestamp = new Date();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var cell = sheet.getActiveCell();
  var sheetName = sheet.getName();

  // if it is the changelog sheet that is being edited, do not record the change
  if (sheetName == changelogSheetName) return;
  if (sheetName == HelperSheetName) return;

  // if the sheet name does not appear in sheetsToWatch, do not record the change
  var matchFound = false;
  for (var i = 0; i < sheetsToWatch.length; i++) {
   if (sheetName.match(sheetsToWatch[i])) matchFound = true;
  }
  if (!matchFound) return;

  var columnLabel = sheet.getRange( 3, cell.getColumn()).getValue();// row 3
  var rowLabel = sheet.getRange(cell.getRow(),  2).getValue();// column B 

  var changelogSheet = ss.getSheetByName(changelogSheetName);
  var HelperSheet = ss.getSheetByName(HelperSheetName);

  if (!changelogSheet) {
    // no changelog sheet found, create it as the last sheet in the spreadsheet
    changelogSheet = ss.insertSheet(changelogSheetName, ss.getNumSheets());
    // Utilities.sleep(2000); // give time for the new sheet to render before going back
    // ss.setActiveSheet(sheet);
    changelogSheet.appendRow(["Email","Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"]);
    changelogSheet.setFrozenRows(1);
  }

  if (!HelperSheet) {
    // no Helper sheet found, create it as the last sheet in the spreadsheet
    HelperSheet = ss.insertSheet(HelperSheetName, ss.getNumSheets());
    // Utilities.sleep(2000); // give time for the new sheet to render before going back
    // ss.setActiveSheet(sheet);
    HelperSheet.appendRow(["Email","Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"]);
    HelperSheet.setFrozenRows(1);
  }
  changelogSheet.appendRow([Session.getActiveUser().getEmail(), timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
     HelperSheet.appendRow([Session.getActiveUser().getEmail(), timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
}

2-й код: этот код защищает лист журнала изменений от редактирования после регистрации в нем исходных данных, сравнивая ячейки в листе журнала изменений с вспомогательным листом, если он пустой, и позволяет записывать данные, если он не пустой. отбрасывает новые данные и восстанавливает старые данные из вспомогательного листа, но этот код не защищает, если один из пользователей, выбирающих несколько ячеек, перетаскивает, например, 10 ячеек, и нажимает кнопку "Удалить" на клавиатуре, это роль третьего кода.

function onEdit2() {


       var masterSheetName = "Changelog" // sheet where the cells are protected from updates
       var helperSheetName = "Helper" // sheet where the values are copied for later checking
       var firstDataRow = 1; // only take into account edits on or below this row
       var firstDataColumn = 1; // only take into account edits on or to the right of this column

       var ss = SpreadsheetApp.getActiveSpreadsheet();
       var sheet = ss.getActiveSheet();
  if (sheet.getName() != masterSheetName) return;
       var cell = sheet.getActiveCell();
  if (cell.getRow() < firstDataRow || cell.getColumn() < firstDataColumn) return;
       var helperSheet = ss.getSheetByName(helperSheetName);
       var helperCell = helperSheet.getRange(cell.getA1Notation());
       var newValue = cell.getValue();
       var oldValue = helperCell.getValue();

  if (oldValue == "") {
      helperCell.setValue(newValue);
  } else {
      masterCell.setValue(oldValue);
  }

}

3-й код: этот код проверяет диапазон данных, выбранных в листе журнала изменений, если один из пользователей удаляет сразу несколько ячеек, он восстанавливает их из вспомогательного листа

function onEdit3(e) {
  // If the edit is made on an invalid sheet, exit.
  if(e.range.getSheet().getName() != 'Changelog') return;

  // Count the number of cells being edited
  var cellsNumber = [].concat.apply([],e.range.getValues()).length; 

  if(cellsNumber == 1 ){
    var helper = e.source.getSheetByName('Helper').getRange(e.range.getA1Notation());
    if(e.range.getValue() != ''){
      helper.setValue(e.value);
    } else {
      e.range.setValue(helper.getValue());
    }
  } else {
    var helper = e.source.getSheetByName('Helper').getRange(e.range.getA1Notation());

    // Count the number of characters on the edited range
    var charsNumber = [].concat.apply([],e.range.getValues()).join('').length;

    if(charsNumber > 0) {

      helper.setValues(e.range.getValues());
    } else {
      e.range.setValues(helper.getValues());
    }
  }
}

0 ответов

Другие вопросы по тегам