Speci c OnEdit функции из библиотеки не работают - PullRequest
0 голосов
/ 05 января 2020

Я создал библиотеку ('CustomerReportLibrary'), в которой есть несколько функций, для которых я создал устанавливаемые триггеры onEdit из сценария электронной таблицы. Две указанные c функции из этой библиотеки не работают (остальные работают ..). Кто-нибудь может пролить свет на причину этого?

Функции, которые не работают:

function restoreRangeSettings(e) {
// retrieves data validation, conditional formatting and formatting settings from template
  var spreadsheet = SpreadsheetApp.getActive();
  var range = e.range;
  var sheet = range.getSheet();
  var A1Notation = range.getA1Notation();
  var templateRange = spreadsheet.getSheetByName(sheet.getName() + ' design').getRange(A1Notation);

  templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
  templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);
  templateRange.copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
}

function logTimestamp(e) {
// logs task last edit timestamp
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = e.range.getSheet();
  var editedCell = sheet.getActiveCell();
  var editedRow = editedCell.getRow();
  var editedColumn = editedCell.getColumn();
  var emailCell = sheet.getRange(editedRow,5);
  var dateCell = sheet.getRange(editedRow,4);
  var time = new Date();
  time = Utilities.formatDate(time, "GMT+02", "dd/MM/yyyy HH:mm:ss");

  // don't do anything if edited sheets are not task sheets
  if ((sheet.getName() == 'instructions') || (sheet.getName() == 'generate report')) {return;}

  // logs timestamp when the edited range is within the task documentation table
  if ((editedColumn() > 7) && (editedRow > 4)) {
    // adds user and month to also to next row when task is added
    if ((sheet.getRange(editedRow,5,1,3).getValues() != '') && (editedColumn == 8) && (sheet.getRange(editedRow+1,4).isBlank())) {
      sheet.getRange(editedRow+1,5,1,3).setValues(sheet.getRange(editedRow,5,1,3).getValues());
    }
    dateCell.setValue(time);
  }
}

Код в скрипте электронной таблицы:

function EditTriggers() {
  var customerSsId = SpreadsheetApp.getActive().getId();
  var customerSpreadsheet = SpreadsheetApp.openById(customerSsId);

  ScriptApp.newTrigger('CustomerReportLibrary.restoreRangeSettings')
  .forSpreadsheet(customerSpreadsheet)
  .onEdit()
  .create();

  ScriptApp.newTrigger('CustomerReportLibrary.logTimestamp')
  .forSpreadsheet(customerSpreadsheet)
  .onEdit()
  .create();

  //works fine
  ScriptApp.newTrigger('CustomerReportLibrary.showRowsAndComments')
  .forSpreadsheet(customerSpreadsheet)
  .onEdit()
  .create();

  //works fine
  ScriptApp.newTrigger('CustomerReportLibrary.optShortcuts')
  .forSpreadsheet(customerSpreadsheet)
  .onEdit()
  .create();
}

Спасибо заранее!

1 Ответ

0 голосов
/ 06 января 2020

Я рад сообщить, что проблема решена!

Первое действие (logTimestamp)

  if ((editedColumn() > 7) && (editedRow > 4)) {

Я случайно упомянул editedColumn как функцию, а не как переменная.

Второе действие (restoreRangeSettings)

Я выбрал другую стратегию для требуемого результата, основываясь на этом ответе . (Смотрите обсуждение того, чего я пытался достичь здесь .)

Третье действие (общее)

Я немного побаловался с определением переменных. Например - определение диапазона как "e.range" не сработало, а определение как "e.source.getActiveRange()" магическим образом.

Наконец - окончательный код

function restoreRangeSettings(e) {
// retrieves data validation, conditional formatting and formatting settings from template
  var editedSs = e.source;
  var editedRange = editedSs.getActiveRange();
  var editedSh = editedRange.getSheet().getName();

  var templateSs = SpreadsheetApp.openById('10zVclYTCEOEwskUID4vxSPxKR_tb3RaR76eG7TfxLUE');
  var templateSh = templateSs.getSheetByName(editedSh);
  var copiedSh = templateSh.copyTo(editedSs).hideSheet();
  var templateRange = editedSs.getSheetByName(copiedSh.getName()).getRange(editedRange.getA1Notation());

  templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
  templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_CONDITIONAL_FORMATTING, false);
  templateRange.copyTo(editedRange, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);

  editedSs.deleteSheet(copiedSh);
}

function logTimestamp(e) {
// logs task last edit timestamp
  var editedRange = e.range;
  var editedSh = editedRange.getSheet();
  var editedRow = editedRange.getRow();
  var editedColumn = editedRange.getColumn();
  var emailCell = editedSh.getRange(editedRow,5);
  var dateCell = editedSh.getRange(editedRow,4);
  var time = new Date();
  time = Utilities.formatDate(time, "GMT+02", "dd/MM/yyyy HH:mm:ss");

  // don't do anything if edited sheets are not task sheets
  if ((editedSh.getName() == 'instructions') || (editedSh.getName() == 'generate report')) {return;}

  // logs timestamp when the edited range is within the task documentation table
  if ((editedColumn > 7) && (editedRow > 4)) {
    // adds user and month to also to next row when task is added
    if ((editedSh.getRange(editedRow,5,1,3).getValues() != '') && (editedColumn == 8) && (editedSh.getRange(editedRow+1,4).isBlank())) {
      editedSh.getRange(editedRow+1,5,1,3).setValues(editedSh.getRange(editedRow,5,1,3).getValues());
    }
    dateCell.setValue(time);
  }
}

Примечание : скрипт электронной таблицы не изменился.

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