首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外推送嵌套数组和信息

意外推送嵌套数组和信息
EN

Stack Overflow用户
提问于 2020-11-12 01:25:55
回答 2查看 58关注 0票数 1

摘要:谷歌应用程序脚本中的(工作表的v8),我尝试将数组元素从一个数组中分割出来,并将其推入另一个数组中。数组将是[ [] [] [] ],但我越来越像[ [] [[]] [[]] ]了。这(我认为)是在使用它来获取changes / setvalues (长度从getrange更改为setvalue)时创建的后面的问题。我会把这些问题分开,但我不知道它们是否相关。

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

Issue1:意外嵌套的数组

想要的outcome1:单嵌套(适合粘贴到google )。

Issue2:在尝试获取range /setValue时,get范围内的data.length与同一行代码中setValues(数据)所需的列不匹配。

所需的outcome2: getRange data.length = setValues数据长度用于getRange和setValues (列)

代码:关于代码的信息(不能放在下面,否则它会出错):函数tester2确实推送/切片,并将变异数组作为对象返回。函数tester1提取返回的对象并记录两个数组。(不确定这是否相关,但它是较大代码的一部分)。日志低于“代码”。

代码语言:javascript
复制
    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;
    }

日志:

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

代码语言:javascript
复制
>[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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 02:06:14

解释:

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

我不知道您想要实现什么,但是您可以通过引入一个具有正确格式的新数组来“修复”这个问题:

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

用它代替arrnew.r2

可行的例子:

代码语言:javascript
复制
 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;
    }
票数 1
EN

Stack Overflow用户

发布于 2020-11-13 01:49:14

马里奥斯给出了一个很好的答案,为具体的例子提供了一个解决办法。我在这里回答这两个问题,我有一些额外的细节。

问题1:为什么我会在下面的表达式中得到长度不匹配的异常setValues(数据)和getRange(列)?

代码语言:javascript
复制
sh.getRange(1,1,arrnew.r1.length,arrnew.r1[0].length).setValues(arrnew.r1);

答案1:我有一个锯齿状数组,即r1 != r11。

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

代码语言:javascript
复制
arr3.push(arr1.splice(1,1));

答案2:只获取剪接的第一个元素以返回[],而不是[[]]。

代码语言:javascript
复制
arr3.push(arr1.splice(1,1)[0]);

来自Marios的额外洞察力:叫做扩展语法,有点像工作表中的‘array式()’函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64796597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档