脚本 运行 多次 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 封电子邮件。
不知何故,当我 运行 脚本时,它会复制触发器。
我根据 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 封电子邮件。
不知何故,当我 运行 脚本时,它会复制触发器。