脚本 运行 多次 onFormSubmit

Script running multiple times onFormSubmit

我根据 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});

}

这是 GAS + Forms 的一个已知问题。解决它的方法是创建一个脚本锁,该锁拒绝(导致它们提前return)一段时间内的所有其他尝试。

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 秒,应该可以防止重复输入)。

我注意到,如果您只是用脚本制作另一个 sheet 的副本,这个错误就会消失。似乎重置了原始副本中的任何问题。也可以尝试 dis-abling 您 google 表单上的回复收据。

我注意到如果我重命名 onFormSubmit 调用的函数并保存脚本,问题就解决了。

如果我在脚本编辑器中单击“运行”,每次提交表单我都会收到 2 封电子邮件。如果我再次单击“运行”,每次提交表单我都会收到 3 封电子邮件。如果我再次更改函数名称,我将重置为每个表单提交仅发送 1 封电子邮件。

不知何故,当我 运行 脚本时,它会复制触发器。