Скрипт запускается несколько раз на FormsSubmit - PullRequest
2 голосов
/ 21 марта 2019

У меня установлен следующий код для запуска на основе триггера onFormSubmit, но иногда он запускается несколько раз с одной и той же отправкой.Я хочу проверить, скопировала ли она уже строку и, если да, остановить сценарий.

function toDo(){
  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});

}

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Я заметил, что если вы просто сделаете еще одну копию листа со скриптом, эта ошибка исчезнет. Кажется, чтобы восстановить все, что было проблемой в оригинальной копии Также попробуйте отключить квитанции ответов в ваших формах Google.

0 голосов
/ 21 марта 2019

это известная проблема с 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 секунд, что должно предотвратить двойной вход).

...