gpt4 book ai didi

multithreading - Google Apps 脚本和表格 : appendRow() regularly overwrites the last row instead of appending a new row below

转载 作者:行者123 更新时间:2023-12-04 14:05:33 28 4
gpt4 key购买 nike

这是我关于 stackoverflow 的第一个问题😊。
背景:
来自 appendRow(rowContents) 的引用我知道此操作是原子操作,这意味着处理对工作表最后一行的并发访问并防止潜在问题。
问题/意外行为:
然而,我最近意识到一个函数的许多并发实例将行附加到同一张表,最后一行定期被覆盖 来自 appendRow(rowContents) 的最新数据, 而不是 rowContents作为最后一行下方的新行附加。
过去,我没有遇到过 appendRow() 的问题。覆盖工作表上的内容。这似乎是最近的现象。然而,这是我的第一个 GAS 项目,它有如此多的并发实例将它们的进度记录到同一个电子表格/工作表中。
实现目标:
独立于并发实例的数量,脚本应该为每个 appendRow() 操作附加一行,而不是覆盖之前的行。
重现问题的小样本:

  • 看到它在行动→ Screen Recording
  • 代码/Google Apps 脚本项目文件 → 包含在 google spreadsheet

  • 我已经尝试过的:
  • 我没有登录电子表格,而是为每个 appendRow() 发送了一封电子邮件。手术。我可以确认这是按预期工作的(我收到了每个 appendRow() 操作的电子邮件)
  • 利用 Lock Service : 只要没有达到尝试获取锁的超时时间,每个appendRow()操作生成一个新行。一旦达到超时,appendRow()再次开始覆盖最后一行。

  • 求助:
  • 有人面临同样的问题吗?
  • 你建议什么解决方法?
  • 我完全错过了什么吗? 😬

  • 任何想法都非常感谢! 🙏

    最佳答案

    使用 appendRow()不推荐在循环内,因为您也可以在此处阅读( Best Practices )。
    取而代之的是:

      for (var i = 0; i < N; i++) {
    var row = [new Date(), task, i]
    s.appendRow(row);
    SpreadsheetApp.flush();
    console.log('row appended: \n',JSON.stringify(row))
    }
    你应该这样做:
      var tb = [];
    for (var i = 0; i < N; i++) {
    var row = [new Date(), task, i];
    tb.push(row);
    }
    s.getRange(s.getLastRow()+1,1,tb.length,tb[0].length).setValues(tb);
    在第一种情况下,您与电子表格文件 N 进行交互。次,而在第二种情况下只有一次。

    关于multithreading - Google Apps 脚本和表格 : appendRow() regularly overwrites the last row instead of appending a new row below,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68642977/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com