当前位置: 首页 > 知识库问答 >
问题:

推送嵌套数组意外和info

岳浩宕
2023-03-14

总结:在google app脚本(v8为工作表)中,我试图从一个数组中切片一个数组元素,并将其推入另一个数组。数组将是[ [] [] [] ],但我喜欢[ [] [[]] [[]] ]。这(我认为)会在使用getRange/setValue时产生稍后的问题,其中长度从getrange更改为setvalue。我会把问题分开,但我不知道它们是否相关。

这对我来说似乎太多了,但当我发布一个简短的答案时,我被要求提供可复制的代码,所以这会更长。

问题1:阵列意外嵌套

期望的结果1:单嵌套(适合粘贴到谷歌工作表)。

问题2:尝试获取范围/设置值时,数据[0]。获取范围中的长度与同一行代码中设置值(数据)所需的列不匹配。

期望的结果2: getRange数据[0]。长度=setValue数据长度用于getRange和setValue(列)

代码:关于代码的信息(不能放在下面,否则会出错):函数tester2会推送/切片,并返回对象上的突变数组。函数tester1拉出返回的对象并记录两个数组。(不确定这是否相关,但它是更大代码的一部分)。日志在代码下面。


    function tester2(){
    
    var arrnew = tester();
    
    llog(arrnew.r1);
    llog(arrnew.r1.length);
    llog(arrnew.r1[0].length);
    llog(arrnew.r2);
    llog(arrnew.r2.length);
    llog(arrnew.r2[0].length);
    
    
    var sh = SpreadsheetApp.getActive().getSheetByName('temp');
    sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);
    sh.getRange(1,1,arrnew.r2.length,arrnew.r2[0].length).setValues(arrnew.r2);
    
    }
    
    function tester(){
    
    var arr1 = [[1,2,3],[4,5,6],[7,8,9],[112,211,311],[411,511,611],[711,811,911]];
    var arr2 = [[11,12,13],[14,15,16],[17,18,19]];
    var arr3 = [['hdr1','hdr2','hdr3']];
    
    for (var r=1;r<arr1.length;r++){
      if(arr1[r][0] % 2 == 0) {
        arr3.push(arr1.splice(1,1));
      }
    }
    
      var rtn = {r1: arr1, r2: arr3};
      return rtn;
    }

日志:

上面的日志放在一起,以便于匹配。(这不是代码,但我不断收到“缩进您的代码”错误。。。

>[20-11-11 19:50:47:811 EST] [[1.0, 2.0, 3.0], [112.0, 211.0, 311.0], [411.0, 511.0, 611.0], [711.0, 811.0, 911.0]] 
>
>[20-11-11 19:50:47:815 EST] 4.0 
>
>[20-11-11 19:50:47:818 EST] 3.0 
>
>[20-11-11 19:50:47:821 EST] [[hdr1, hdr2, hdr3], [[4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0]]]  *** notice double-nesting
>
>[20-11-11 19:50:47:823 EST] 3.0 
>
>[20-11-11 19:50:47:826 EST] 3.0 
>
>[20-11-11 19:50:48:240 EST] Exception: The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 3. at tester2(dcmv1:229:55)
>*** code line 229 begins:  sh.getRange(1,1,arrnew.r1

共有2个答案

皇甫宇定
2023-03-14

Marios在下面给出了一个很好的答案,为特定的例子提供了一个解决方案。我在这里回答这两个问题,我有一些额外的细节。

问题1:为什么在下面的表达式中出现长度不匹配异常setValues(data)和getRange(columns)?

sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);

回答1:我有一个锯齿数组,即r1[0]!=r1[1].

问题2:如何阻止下面的表达式创建锯齿数组?

arr3.push(arr1.splice(1,1));

答案2:只抓取拼接的第一个元素[0]返回[]而不是[[]]。

arr3.push(arr1.splice(1,1)[0]);

Marios的额外见解:称为扩散语法,有点像Sheets中的“array公式()”函数

艾修然
2023-03-14

问题确实是第二和第三个要素中的双括号。第二和第三个元素具有[[]]的结构,因此它们的长度是1,而不是像第一个元素那样的3。您可以看到,如果您执行Logger.log(arrnew. r2[1]。长度),您将获得1,因为括号[[]]内只有一个元素[]。但是在第一个括号内有3元素hdr1, hdr2, hdr3[hdr1, hdr2, hdr3]因此Logger.log(arrnew. r2[0]. long)返回3

我不确定您想要实现什么,但您可以通过引入具有正确格式的新阵列来“修复”这一问题:

data2=[arrnew.r2[0],…arrnew.r2[1],…arrnew.r2[2]

并使用它而不是arrnew.r2

 function tester2(){
    
    var arrnew = tester();
    data2 = [arrnew.r2[0],...arrnew.r2[1],...arrnew.r2[2]]  
    var sh = SpreadsheetApp.getActive().getSheetByName('temp');
    sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);
    sh.getRange(1,1,arrnew.r2.length,arrnew.r2[0].length).setValues(data2);
    
    }
    
    function tester(){
    
    var arr1 = [[1,2,3],[4,5,6],[7,8,9],[112,211,311],[411,511,611],[711,811,911]];
    var arr2 = [[11,12,13],[14,15,16],[17,18,19]];
    var arr3 = [['hdr1','hdr2','hdr3']];
    
    for (var r=1;r<arr1.length;r++){
      if(arr1[r][0] % 2 == 0) {
        arr3.push(arr1.splice(1,1));
      }
    }
    
      var rtn = {r1: arr1, r2: arr3};
      return rtn;
    }
 类似资料:
  • 问题内容: TL; DR -我该如何检查是否 之一的 和 所有的 嵌套数组满足规定的标准是什么? 我有一个。每个对象都有一个嵌套对象数组,这些对象本身都有一个嵌套对象列表。我需要对所有文档中 至少一个嵌套对象匹配的文档执行过滤器。当我说的比赛,我的意思是 所有 的嵌套对象的对象以某种方式相匹配。这是一个示例映射,以供参考; 如果文档没有/ 对象,则认为是匹配的。但是,更糟糕的是,内部对象需要考虑以

  • 问题内容: 我是python的新手,所以请原谅任何愚蠢的错误,但是经过研究,我无法弄清楚。我正在根据日历中月份中的几天列表创建字典。我最初使用过,但发现此提交使我确信更改为我拥有的字典理解语句。然后,我给字典中的每个值分配另一个字典,该字典以星期几作为键,另一个字典作为值。这本词典是taskDic,以家务作为键,将人的名字作为值。 我的问题是,即使循环只是在第一天,循环中的最后一条语句仍每天分配同

  • 问题内容: 我有一个示例数组,用于将条目插入到YUI数据表中 我可以通过这样做获得相同的阵列吗? 我在这里尝试的是编写一个通用方法,该方法将遍历结果列表并在将来能够形成一个条目。 所以我怎样才能使数组与本书代码的第一部分相同? 添加了我的整个示例代码,带注释的书本数组似乎可以工作,但未注释的部分似乎无法显示行 问题答案: 我尝试并找到了解决方案,因为在我按入后,att和值将成为对象 这将使其显示在

  • 问题内容: 我有一个从数据库(JSON MySQL中的数据存储)检索数据的程序。 我设法得到对象。输出为: JSON对象: 我需要有关如何处理数据并将信息放入不同数组/对象的建议。例如 谢谢。 问题答案: 您可以使用Jackson Api来实现。 您必须创建与json对象相同的Pojo类(该类应具有“ attributes”,“ uuid”之类的成员)。 这是您必须使用的类 和代码 现在,您可以使

  • 问题内容: 我在另一个ng-repeat中嵌套了一个ng-repeat。我想在单击按钮时将一些值推入第二个数组 谁可以帮我这个事。谢谢 问题答案:

  • 使用嵌套循环 我仍在努力实现上述问题所述的目标。基本上我的代码现在是这样的: 这很烦人,我不明白为什么会这样! 我想计算地球因太阳和月亮而产生的加速度。所以我有双[]行星质量={earthMass,sunMass,moonMass},一系列粒子物体粒子[]行星={earth,sun,moon}和一系列由于重力而产生的加速度,它们还没有被计算出来:物理矢量[]gravField={earthGrav