我正在使用一个Android应用程序来记录学生的出勤率,这个应用程序可以填充谷歌页面。
有来自应用程序的各种字段,如时间戳、条形码信息、电子邮件、地理位置和主题代码。
有一个onChange触发器,它创建一个时间戳,并将其插入到一个列中,该表以主题代码(ICTE4115)命名。
问题所在
当我把出勤率“打开”以便学生们能记录他们的出勤率时,很多人都试着同时做,特别是在前几分钟。我的代码运行良好,但在某些情况下,
onChange触发器不工作,并且输入没有插入到Google中。这可能是由于网络问题。不确定锁服务是否有效。我能做什么?
我的代码如下:
function autoConvert(e) {
try {
LockService.getScriptLock().waitLock(2000);
var ss = e.source;
var sh = ss.getActiveSheet();
var key = sh.getName();
var lastRow = sh.getLastRow();
if (
key.indexOf("0") > -1 ||
key.indexOf("1") > -1 ||
key.indexOf("2") > -1 ||
key.indexOf("3") > -1 ||
key.indexOf("4") > -1 ||
key.indexOf("5") > -1 ||
key.indexOf("6") > -1 ||
key.indexOf("7") > -1 ||
key.indexOf("8") > -1 ||
key.indexOf("9") > -1
) {
if (lastRow > 10) {
sh.getRange(lastRow - 9, 6).setValue(key);
sh.getRange(lastRow - 9, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 8, 6).setValue(key);
sh.getRange(lastRow - 8, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 7, 6).setValue(key);
sh.getRange(lastRow - 7, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 6, 6).setValue(key);
sh.getRange(lastRow - 6, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 5, 6).setValue(key);
sh.getRange(lastRow - 5, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 4, 6).setValue(key);
sh.getRange(lastRow - 4, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 3, 6).setValue(key);
sh.getRange(lastRow - 3, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 2, 6).setValue(key);
sh.getRange(lastRow - 2, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow - 1, 6).setValue(key);
sh.getRange(lastRow - 1, 1).setNumberFormat("yyyy-mm-dd");
sh.getRange(lastRow, 6).setValue(key);
sh.getRange(lastRow, 1).setNumberFormat("yyyy-mm-dd");
} else {
for (var i = 2; i <= lastRow; i++) {
sh.getRange(i, 6).setValue(key);
sh.getRange(i, 1).setNumberFormat("yyyy-mm-dd");
}
}
}
LockService.getScriptLock().releaseLock();
} catch (e) {
SpreadsheetApp.flush();
}
}发布于 2020-10-07 10:41:00
这是一个带有触发器的已知问题。
确保“明星”的问题,让谷歌的开发人员知道,这会影响你。
问题是:
如果许多编辑快速地连续发生(<500 my至少在我的测试中),那么触发器函数就会“丢失”。这似乎是你所经历的。Google控制台日志记录证实了这一点,因为它没有注册错误,只是已经成功执行的触发器函数。
可能的解决办法:
Web应用程序
根据学生人数,您可以尝试设置应用程序脚本Web应用程序。例如,这可能会让你的Android应用程序向web应用程序发出帖子请求。您的web应用程序需要一个doPost功能,它将根据POST请求中的参数编辑Google。
正如Google 配额制所引用的那样,只能有30个同时连接到web应用程序。然而,这应该是对触发器的一个很大的改进,AFAIK只能使用队列2触发器。也就是说,一旦onEdit触发器开始执行,那么更多的触发器可以并行运行。
https://stackoverflow.com/questions/64230865
复制相似问题