Ответ 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)
.
* Отформатированный в ячейке "обычный текст" сохранит дату в виде строки и не является хорошей идеей.