Я использовал триггер On Edit в скрипте приложений Google. При создании этого сценария я заметил, что существует небольшой промежуток времени между тем, когда пользователь заканчивает редактирование листа Google, и когда начинает выполняться функция, вызываемая триггером On Edit. Несмотря на то, что это время задержки короткое, оно достаточно для того, чтобы пользователь мог быстро внести дополнительные изменения в лист перед запуском функции, вызываемой триггером On Edit.
Есть ли способ уменьшить / устранить это время задержки или запретить пользователю вносить какие-либо изменения в лист в ожидании запуска функции?
Я понимаю, что код внутри Функция может вызвать задержку во время работы функции, но я могу решить эту проблему, временно защитив лист во время выполнения функции и сняв защиту с нее в конце функции. Это все еще оставляет проблему со временем задержки от триггера, потому что я не могу защитить лист, пока функция не начнет работать.
Я могу доказать существование времени задержки с помощью приведенного ниже кода. Первое, что делает эта функция при вызове триггером On Edit, устанавливает значение ячейки G1 равным 69. Если вы удаляете 69 в G1, вы можете быстро ввести другой номер и ввести его, прежде чем функция вернет значение обратно на 69 снова. Дополнительный код и другие материалы на листе служат только для демонстрации того, чего именно я пытаюсь достичь и почему. Вот ссылка на соответствующий Google лист (он запускает функцию в блоке кода ниже при запуске редактирования): https://docs.google.com/spreadsheets/d/1BZB7YWguMdts-pvr7SSSEDUgSAOe023o9b_6VOhUoLw/edit?usp=sharing
// The goal of this function is to only allow the user to fill in column A with items from column D. The user should only be able to enter each item from column D once, but they can
// be moved around and replaced at will.
function triggerTest() {
//These two lines are just to quickly prove lag time. Nothing to do with the rest of this code...
let testCell = SpreadsheetApp.getActiveSheet().getRange('G1');
testCell.setValue(69);
//These next 4 lines are just putting the values in column A and column D into arrays (getDisplayValues() returns a 2d array)
//The cleanArray function deletes blank cells from the array and makes it a 1d array
let databaseValues = SpreadsheetApp.getActiveSheet().getRange('D2:D11').getDisplayValues();
let cleanDatabaseValues = cleanArray(databaseValues);
let itemsColumnValues = SpreadsheetApp.getActiveSheet().getRange('A2:A11').getDisplayValues();
let cleanItemsColumnValues = cleanArray(itemsColumnValues);
//These for loops find all items in the column D that are not already in column A and puts them into a new array - valuesInDatabaseAndNotInItemsColumn[]
let valuesInDatabaseAndNotInItemsColumn = cleanDatabaseValues;
for(let i=0; i<cleanItemsColumnValues.length; i++){
for(let j=0; j<valuesInDatabaseAndNotInItemsColumn.length; j++){
if(valuesInDatabaseAndNotInItemsColumn[j] === cleanItemsColumnValues[i]){
valuesInDatabaseAndNotInItemsColumn.splice(j,1);
j--;
}
}
}
//This is the data validation for column A. It only allows values that are in Database column and NOT already in the Items column. If there is a duplicate both entries are invalid.
//Since every cell undergoes validation, the cells that already contain entries must be allowed to keep them which is the reason for the .concat on line 44. Duplicate cells are not
//allowed to contain their current value, hence the absence of .concat on line 41.
for(let i=0; i<itemsColumnValues.length; i++){
let cellIndex = (i + 2).toString();
let cell = SpreadsheetApp.getActiveSheet().getRange('A'+ cellIndex);
let duplicate = false;
let cellValidation = SpreadsheetApp.newDataValidation();
for(let j=0; j<itemsColumnValues.length; j++){ //This for loop tests to see if there is a duplicate of the entry
if(j != i && itemsColumnValues[j][0] === itemsColumnValues[i][0]){
duplicate = true;
}
}
if(duplicate === true){
cellValidation.requireValueInList(valuesInDatabaseAndNotInItemsColumn, true).setAllowInvalid(false).build();
}
else{
cellValidation.requireValueInList(valuesInDatabaseAndNotInItemsColumn.concat(itemsColumnValues[i][0]), true).setAllowInvalid(false).build();
}
cell.setDataValidation(cellValidation);
}
}