gpt4 book ai didi

google-apps-script - 添加上面的新行时,如何获取范围的实际位置

转载 作者:行者123 更新时间:2023-12-03 11:23:34 26 4
gpt4 key购买 nike

考虑这种情况。

  var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("2:2");
var values = range.getValues();
values[0][0] = "updated value"; //updating retrieved data
sheet.insertRowAfter(1); //here the problem appears
range.setValues(values); //trying to save updated row data - FAIL!

更新的行值将写入第 2 行(根据范围选择器“2:2”)而不是新位置“3:3”。
结果:它将覆盖第 2 行的数据,而不是更新先前选择/加载的行,该行现在位于“3:3”位置,不再位于“2:2”。

我正在寻找一种方法,即使由于在工作表中的其他位置添加/删除了行/单元格而移动了范围,如何保持范围的“地址”。

在这个虚拟示例中,我可以跟踪范围变化。但是在并行处理/更新表中,我不能简单地跟踪来自许多不同地方的所有更改。

到目前为止,我想出了一个仅在 SS 末尾添加新行的解决方案(这不会改变上面任何行的范围,但我希望能够在不影响已选择范围的情况下在工作表顶部添加新行。
删除行也是危险的情况 - 它也会改变范围的位置。

LockService 不能真正解决这种情况,因为我有很多脚本在同一张纸上工作(由于插件的速度性能,不使用集中式库)。

对于这样一个简单的任务,单元格或行的元数据似乎太复杂而无法处理。

从我的角度来看,对象范围应该保持它的位置,即使它移动/移动到其他地方。否则我看不出有理由将 Range 作为对象 - 如果它只保留关于它被选择的位置的固定信息。
欢迎任何建议。先感谢您..

编辑:

只是为了添加上下文。我正在使用 Google 表格作为订单数据库(到目前为止有 1 万个)-每行表示一个订单(客户),并非所有订单都在一张表格中-不同的产品有不同的表格(+- 10 个产品/表格)

有一个建议使用命名范围来解决这个问题 - 那么如果电子表格将有数万个命名范围会发生什么 - 这可以在没有严重性能问题的情况下工作吗?我正在考虑为每个订单行创建命名范围,这样我就可以轻松地通过 orderId 选择正确的行,而不必害怕在处理另一个订单时在新订单到达时移动一行

最佳答案

  • 您要实现以下流程。
  • "2:2" 中检索值(第 2 行)。
  • 修改检索到的值。
  • 在第 1 行的正下方插入一行。
  • 这样,最初的第 2 行移动到第 3 行。
  • 将检索到的值放入第 3 行,即初始第 2 行。
  • 您想使用 Google Apps 脚本来实现这一点。

  • 如果我的理解是正确的,这个答案怎么样?请将此视为几个答案之一。

    问题及解决方法:
  • 在您的脚本中,rangevar range = sheet.getRange("2:2");是常数。这样,即使插入行,该值也不会改变。这就是你的问题的原因。
  • 我认为使用命名范围的想法将针对您的情况得到解决。但是your comment说如下。
  • I just found, that namedRange is not capable actualize its own address, if something had changed in the sheet after initialize of a range.
  • 当第 2 行安装为命名范围时,当将一行插入到第 1 行的正下方时,命名范围的范围也会更改。但是根据您的评论,我认为命名范围可能尚未重新加载。

  • 为了确认这一点,我想提出一个示例脚本。

    示例脚本:

    在运行脚本之前,请在第 2 行安装一个命名范围作为 sampleNamedRange 的名称。 .然后,运行此脚本。
    var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
    var sheet = ss.getActiveSheet(); // Modified

    // Retrieve the range from the namedRange.
    // namedRange of "sampleNamedRange" is installed for the range of "2:2" of the active sheet.
    var range = ss.getRangeByName("sampleNamedRange"); // Modified
    var values = range.getValues();
    values[0][0] = "updated value"; //updating retrieved data
    sheet.insertRowAfter(1);

    // Retrieve the range from the updated namedRange.
    var range = ss.getRangeByName("sampleNamedRange"); // Added
    range.setValues(values);

    结果:

    enter image description here

    笔记:
  • 关键是从更新的命名范围中检索范围。由此,可以使用更新的范围。所以在上面的脚本中,更新后的值放在第 3 行。

  • 引用:
  • getRangeByName()
  • Class NamedRange

  • 如果我误解了您的问题并且这不是您想要的结果,我深表歉意

    关于google-apps-script - 添加上面的新行时,如何获取范围的实际位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52777954/

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