Jin*_*ček 5 google-sheets google-apps-script
考虑这种情况。
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!
Run Code Online (Sandbox Code Playgroud)
更新后的行值将被写入第2行(根据范围选择器“ 2:2”),而不是在新位置“ 3:3”。结果:它将覆盖第二行的数据,而不是更新先前选择/加载的行,该行现在位于位置“ 3:3”,而不再位于“ 2:2”。
我正在寻找一种方法,即使由于在工作表中其他位置添加/删除的行/单元格而移动了范围时,也该如何保持范围的“地址”。
在此虚拟示例中,我可以跟踪范围变化。但是在并行处理/更新工作表中,我不能简单地跟踪来自许多不同地方的所有更改。
到目前为止,我想出了一个解决方案,仅在SS的末尾添加新行(这不会更改上面任何行的范围,但是我希望能够在表格顶部添加新行而不影响已经选择的范围。行也是危险的情况-它也会改变范围的位置。
LockService不能真正解决这种情况,因为我在同一张工作表上有很多脚本(由于插件的速度性能,不使用集中式库)。
单元格或行的元数据似乎太复杂了,无法完成如此简单的任务。
从我的角度来看,即使对象范围移动/移动到其他位置,它也应保持其位置。否则,我看不到将Range作为对象的原因-如果它仅保留有关从何处拾取的固定信息。欢迎任何建议。先感谢您..
编辑:
仅添加上下文。我使用Google表格作为订单的数据库(到目前为止有1万个)-每行表示一个订单(客户),而并非所有订单都在一张表格中-不同的产品具有不同的表格(+-10个产品/表格)
有一个建议使用命名范围来解决此问题-那么,如果电子表格将具有成千上万个命名范围,会发生什么情况-在没有严重的性能问题的情况下可以正常工作吗?我正在考虑为每个订单行创建命名范围,因此我可以轻松地按orderId选择正确的行,而不必担心在处理另一个订单时新订单到达时移动一行
"2:2"从(第 2 行)检索值。如果我的理解是正确的,这个答案怎么样?请将此视为多个答案之一。
在您的脚本中,rangeofvar range = sheet.getRange("2:2");是常量。这样,即使插入行,该值也不会改变。这就是你的问题的原因。
我认为使用命名范围的想法将针对您的情况得到解决。但你的评论如下。
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);
Run Code Online (Sandbox Code Playgroud)
如果我误解了您的问题并且这不是您想要的结果,我深表歉意
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |