Я пытаюсь запустить функцию onEdit для трех отдельных вкладок, но получаю TypeError: Невозможно прочитать свойство 'значение' из неопределенного - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь запустить функцию onEdit для трех отдельных вкладок, но получаю TypeError: Невозможно прочитать свойство 'значение' из неопределенного. Первая функция onEdit (e) работает правильно сама по себе, но не с двумя другими функциями.

 function onEdit(e) { 
      if (e.value === 'COMPLETED FAB') {
        var sheet = e.range.getSheet();
        if (sheet.getSheetName() == 'Fabrication') {                     
          logSheet = e.source.getSheetByName('Fabrication Completed');    
          var row = e.range.getRow(); 
          var lastRow = logSheet.getLastRow();
          var range = sheet.getRange(row, 1, 1, sheet.getLastColumn()); 
          range.copyTo(logSheet.getRange(lastRow + 1, 1));
          sheet.deleteRow(row);
        }
      }
    }


    function onEdit(event) { 
      if (event.value === 'FINISHED') {
        var sheet1 = event.range.getSheet();
        if (sheet1.getSheetName() == 'Service') {                     
          logSheet1 = event.source.getSheetByName('Service Completed');  
          var row1 = event.range.getRow(); 
          var lastRow1 = logSheet1.getLastRow();
          var range1 = sheet1.getRange(row, 1, 1, sheet.getLastColumn()); 
          range1.copyTo(logSheet1.getRange(lastRow + 1, 1));
          sheet1.deleteRow(row);
        }
      }
    }

    function onEdit(event2) { 
      if (event2.value === 'COMPLETED SURVEYS') {
        var sheet2 = event2.range.getSheet();
        if (sheet2.getSheetName() == 'Survey') {               
          logSheet2 = event2.source.getSheetByName('Fabrication');    
          var row2 = event2.range.getRow(); 
          var lastRow2 = logSheet2.getLastRow();
          var range2 = sheet2.getRange(row, 1, 1, sheet.getLastColumn()); 
          range2.copyTo(logSheet2.getRange(lastRow + 1, 1));
          sheet2.deleteRow(row);
        }
      }
    }

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Один из основных принципов программирования - DRY (не повторяйте себя). У вас есть три функции, которые отличаются только используемыми строковыми значениями, что означает, что все они могут быть легко объединены в одну функцию. Поскольку вы сказали, что первая функция не вызывает проблем, вероятно, их объединение устранит вашу ошибку и создаст более качественный код.

В приведенном ниже примере кода обратите внимание, что строки, которые не меняются, находятся за пределами оператор if/then.

function onEdit(e) { 
  // Set strings and corresponding values
  let values = ["COMPLETED FAB","FINISHED","COMPLETED SURVEYS"];
  let states = ["Fabrication Completed", "Service Completed", "Fabrication"];

  var sheet = e.range.getSheet();

  if (e.value === values[0]) {
    if (sheet.getSheetName() == 'Fabrication') {                     
      logSheet = e.source.getSheetByName(sates[0]);    
    }
  } else if (e.value === values[1]) {
    if (sheet1.getSheetName() == 'Service') {                     
      logSheet1 = e.source.getSheetByName(states[1]);
    }  
  } else if (e.value === values[2]) {
    if (sheet2.getSheetName() == 'Survey') {               
      logSheet2 = e.source.getSheetByName(states[2]);    
    }
  } else {
    // No valid input
    return false;
  }

  var row = e.range.getRow(); 
  var lastRow = logSheet.getLastRow();
  var range = sheet.getRange(row, 1, 1, sheet.getLastColumn()); 
  range.copyTo(logSheet.getRange(lastRow + 1, 1));
  sheet.deleteRow(row);
}
1 голос
/ 24 марта 2020

Вы должны иметь только одну функцию onEdit(e) и использовать операторы if / else if для предоставления различных функций для различных значений событий.

function onEdit(e) {
      if (e.value === 'COMPLETED FAB') {
        // Rest of the code
      }
      else if (e.value === 'FINISHED') {
        // Rest of the code
      }
      else if (e.value === 'COMPLETED SURVEYS') {
        // Rest of the code
      }
}
...