【问题标题】:appendRow returns [Ljava.lang.Object;@ instead of valuesappendRow 返回 [Ljava.lang.Object;@ 而不是值
【发布时间】:2020-09-28 11:13:49
【问题描述】:

我想将表单提交复制到不同的工作表,以便可以在不影响原始提交的情况下编辑复制的数据。

我有以下代码:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues();

  tracker.appendRow([null,row[0]]);

appendRow 中使用null 可帮助您将信息移至下一列。但是,它不适用于row[0] 数组。如果我删除 null 它可以正常工作,但我希望将信息复制到与第一个不同的列上。

【问题讨论】:

标签: javascript google-apps-script google-sheets


【解决方案1】:

为什么选择 Ljava.lang.Object?

因为您使用的是用 Java 编写的旧版 Rhino 运行时。因此,当意外发生时,您会看到 GAS 所基于的基础设施。现在,java.lang.object 是 Java 中的一个基类,包括数组在内的其他对象都是从该基类派生而来的。

由于 appendRow 方法签名的唯一参数接受一维值数组,因此您的 row[0] 包含一个数组(请参阅 getvalues 方法返回的内容),将其作为字符串标记添加到工作表中,指示这是运行时的对象。

在 Rhino 中可以做什么?

所有解决方案都依赖于将[ null ] 作为基本数组并使用concat 附加第一行的其余部分,如下所示:[ null ].concat(row[0])。您还可以将push 与简单的for 循环一起使用以获得更好的性能。

在 V8 中做什么0

正如提到的另一个答案,您最好的选择是spread syntax。您还可以使用push(...row[0]) 来避免数组串联(因为您会立即使用并丢弃由[ null, ...row[0] ] 生成的副本)。


0请参阅official docs,了解如何迁移到 V8 以利用新的语言功能并提高速度。

【讨论】:

  • 我要感谢您为我提供如此详细而有见地的回复。我不仅能够解决我的问题,而且还能够理解其背后的原因。知识就是力量,谢谢分享:)
  • @DiegoF - 谢谢,很高兴能为您提供帮助。我知道如果您不知道引擎盖下的内容,当您不小心尝试将数组或对象保存到单元格时,看到输出 java.lang.object 可能会令人困惑。小建议 - 放弃编辑器并使用安装了 @types/google-apps-script 包的本地 IDE - 您很快就会注意到此类错误的数量显着下降 :)
【解决方案2】:

说明:

  • 使用null 的方法显然是一种解决方法,而不是面向未来的 解决方案。也就是说,如果你想从第 4 列开始粘贴,你 将不得不做[null,null,null,...row[0]] 这是不正确的 我认为这样做的方法。
  • 我建议你摆脱appendRownull,因为你 想要从 第二列 开始粘贴数据。所以, 请改用setValues()

替换:

tracker.appendRow([null,row[0]]);

与:

tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);


完整解决方案:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues(); 
  tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
}

【讨论】:

  • 这成功了!!光滑而精致!!我同意,只需要修改 getRange() 语句中的列参数就更实用了。非常感谢您花时间帮助我,我真的很感激!
【解决方案3】:

row 变量包含一个数组,因此您应该将扩展运算符与appendRow 一起使用

替换:

tracker.appendRow([null,row[0]]);

与:

tracker.appendRow([null,...row[0]]);

确保您的项目已启用 Chrome V8 运行时。

【讨论】:

  • Niiice,这摆脱了烦人的对象错误,感谢您的澄清!有趣的是,这种方法不一定是最实用的,正如 Marios 所提到的,因为我们必须添加更多的“null”来复制其他列。谢谢楼主!
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2019-11-23
  • 2016-04-19
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多