首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >面对问题时,从安卓应用程序的输入到谷歌工作表和使用onChange触发器?

面对问题时,从安卓应用程序的输入到谷歌工作表和使用onChange触发器?
EN

Stack Overflow用户
提问于 2020-10-06 17:22:34
回答 1查看 57关注 0票数 1

我正在使用一个Android应用程序来记录学生的出勤率,这个应用程序可以填充谷歌页面。

有来自应用程序的各种字段,如时间戳、条形码信息、电子邮件、地理位置和主题代码。

有一个onChange触发器,它创建一个时间戳,并将其插入到一个列中,该表以主题代码(ICTE4115)命名。

问题所在

当我把出勤率“打开”以便学生们能记录他们的出勤率时,很多人都试着同时做,特别是在前几分钟。我的代码运行良好,但在某些情况下,onChange触发器不工作,并且输入没有插入到Google中。这可能是由于网络问题。不确定锁服务是否有效。我能做什么?

我的代码如下:

代码语言:javascript
复制
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();
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-10-07 10:41:00

这是一个带有触发器的已知问题

确保“明星”的问题,让谷歌的开发人员知道,这会影响你。

问题是:

如果许多编辑快速地连续发生(<500 my至少在我的测试中),那么触发器函数就会“丢失”。这似乎是你所经历的。Google控制台日志记录证实了这一点,因为它没有注册错误,只是已经成功执行的触发器函数。

可能的解决办法:

Web应用程序

根据学生人数,您可以尝试设置应用程序脚本Web应用程序。例如,这可能会让你的Android应用程序向web应用程序发出帖子请求。您的web应用程序需要一个doPost功能,它将根据POST请求中的参数编辑Google。

正如Google 配额制所引用的那样,只能有30个同时连接到web应用程序。然而,这应该是对触发器的一个很大的改进,AFAIK只能使用队列2触发器。也就是说,一旦onEdit触发器开始执行,那么更多的触发器可以并行运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64230865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档