Как проверить функцию триггера в GAS?

Google-apps- script поддерживает Triggers, которые передают Events для запуска функций. К сожалению, среда разработки позволит вам тестировать функции без передачи параметров, поэтому вы не можете имитировать событие таким образом. Если вы попытаетесь, вы получите сообщение об ошибке:

ReferenceError: 'e' is not defined.

Можно рассматривать событие как необязательный параметр и вставлять значение по умолчанию в функцию триггера, используя любой из методов из Есть ли лучший способ делать необязательные параметры функции в Javascript?". Но это создает риск того, что ленивый программист (встанет, если это вы!) Оставит этот код позади, с непреднамеренными побочными эффектами.

Конечно, есть лучшие способы?

Ответ 1

Вы можете написать тестовую функцию, которая передает симулированное событие в вашу триггерную функцию. Вот пример, который проверяет триггерную функцию onEdit(). Он передает объект события со всей информацией, описанной для "Редактирование электронных таблиц" в Общие сведения о событиях.

Чтобы использовать его, установите точку останова в целевой целевой функции onEdit, выберите функцию test_onEdit и нажмите Debug.

/**
 * Test function for onEdit. Passes an event object to simulate an edit to
 * a cell in a spreadsheet.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onEdit() {
  onEdit({
    user : Session.getActiveUser().getEmail(),
    source : SpreadsheetApp.getActiveSpreadsheet(),
    range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
    value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
    authMode : "LIMITED"
  });
}

Если вам интересно, это было написано для проверки функции onEdit для Таблицы Google на трех ячеек.

Здесь находится тестовая функция для событий представления формы электронных таблиц. Он создает свое смоделированное событие, читая данные представления формы. Это было первоначально написано для Получение TypeError в триггере onFormSubmit?.

/**
 * Test function for Spreadsheet Form Submit trigger functions.
 * Loops through content of sheet, creating simulated Form Submit Events.
 *
 * Check for updates: https://stackoverflow.com/a/16089067/1677912
 *
 * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
 */
function test_onFormSubmit() {
  var dataRange = SpreadsheetApp.getActiveSheet().getDataRange();
  var data = dataRange.getValues();
  var headers = data[0];
  // Start at row 1, skipping headers in row 0
  for (var row=1; row < data.length; row++) {
    var e = {};
    e.values = data[row].filter(Boolean);  // filter: https://stackoverflow.com/a/19888749
    e.range = dataRange.offset(row,0,1,data[0].length);
    e.namedValues = {};
    // Loop through headers to create namedValues object
    // NOTE: all namedValues are arrays.
    for (var col=0; col<headers.length; col++) {
      e.namedValues[headers[col]] = [data[row][col]];
    }
    // Pass the simulated event to onFormSubmit
    onFormSubmit(e);
  }
}

Советы

При имитации событий старайтесь соответствовать объектам документированных событий как можно ближе.

  • Если вы хотите проверить документацию, вы можете зарегистрировать полученное событие из своей триггерной функции.

    Logger.log( JSON.stringify( e , null, 2 ) );
    
  • В событиях представления формы электронной таблицы:

    • все значения namedValues ​​являются массивами.
    • Временные метки - это строки, и их формат будет локализован в локали формы. Если читать из таблицы с форматированием по умолчанию * это объекты Date. Если ваша функция триггера зависит от формата строки временной метки (что является плохой идеей), позаботьтесь, чтобы вы правильно имитировали значение.
    • Если у вас есть столбцы в вашей электронной таблице, которые не находятся в вашей форме, метод в этом script будет имитировать "событие" с добавленными дополнительными значениями, что не является тем, что вы получите из представления формы.
    • Как сообщается в Issue 4335, массив values пропускает пустые ответы (в "новых формах" + "новые листы" ). Для моделирования этого поведения используется метод filter(Boolean).

* Отформатированный в ячейке "обычный текст" сохранит дату в виде строки и не является хорошей идеей.

Ответ 2

Обновление 2017: Отлаживаем Объекты событий с Запись в Stackdriver для Google Apps Script. В строке меню в редакторе script перейти: View > Stackdriver Logging для просмотра или потока журналов.

console.log() будет писать сообщения уровня DEBUG

Пример onEdit():

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

Пример onFormSubmit():

function onFormSubmit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    namedValues: e.namedValues,
    range:  e.range.getA1Notation(),
    value:  e.value
  }

  console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e});
}

Пример onChange():

function onChange (e) {
  var debug_e = {
    authMode:  e.authMode,  
    changeType: changeType,
    user:  e.user
  }

  console.log({message: 'onChange() Event Object', eventObject: debug_e});
}

Затем проверьте журналы в Stackdriver UI, помеченные как строка message, чтобы увидеть вывод