это известная проблема с GAS + Forms. Чтобы решить эту проблему, нужно создать блокировку сценария, которая отклоняет (заставляя их досрочно вернуть) все другие попытки в течение определенного периода времени.
function toDo(){
SpreadsheetApp.flush();
var lock = LockService.getScriptLock();
try {
lock.waitLock(5000);
} catch (e) {
Logger.log('Could not obtain lock after 5seconds.');
return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>")
// In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side
return "Error: Server busy try again later... Sorry :("
}
var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1");
var jobs = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Jobs");
var lastrow = responses.getLastRow();
var col = responses.getLastColumn();
var row = responses.getRange(lastrow, 1, 1, 19).getValues();
jobs.appendRow(row[0]);
//copyValuesOnly(copyFromRange, copyToRangeStart);
var si = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Jobs');
var range = si.getRange("A2:R");
range.sort({column: 5,ascending: true}),({column: 1, ascending:true});
Utilities.sleep(5000);
lock.releaseLock)();
}
У меня были скрипты, которые делают это до 8 раз, и обычно делают это каждые 2-3 секунды. С этим решением вы делаете блокировку в начале, а затем спите в конце, чтобы убедиться, что время процесса больше, чем время ожидания. (Здесь я использовал 5 секунд, что должно предотвратить двойной вход).