【问题标题】:Using setValues() with arrays of different lengths将 setValues() 与不同长度的数组一起使用
【发布时间】:2015-01-09 15:54:45
【问题描述】:

我在 Google 应用程序脚本中有一个二维数组,其中包含不同长度的数组。我想在电子表格中设置数组的值。但是,由于其中的数组长度不同,我收到一个错误,基本上说范围和数组高度不对齐。我在下面列出了数组结构的示例。

如果我向每个单独的数组添加空值以使它们都匹配最长数组的长度,我可以让它工作。不过,这似乎是一种解决方法。还有另一种方法可以设置二维数组的值吗?

var array = [
  [a],
  [b,c],
  [d,e],
  [],
  [f,g,h,i],
  [],
  [j,k],
  ]

【问题讨论】:

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


    【解决方案1】:

    不,你不能。尺寸必须匹配。

    如果您的“行”长度差异很大,您可以做的是单独设置每一行。

    for( var i = 0; i < array.length; ++i )
      sheet.getRange(i+1, 1, 1, array[i].length).setValues([array[i]]);
    

    但这只是另一种解决方法。但是在您的数组上工作以使所有长度都匹配并执行单个 setValues 可能会表现得更好。

    【讨论】:

    • 谢谢,恩里克。感谢您的回答。
    • henrique 的回答是正确的。正如 Henrique 的回答所建议的那样,我添加了一个简单的解决方法来重新调整每个行数组的尺寸。当心我在我的手机上输入了所有这些而不是运行它。不过看起来不错。
    【解决方案2】:

    如果你的真实数组有很多行,单独写入会很昂贵。由于 js 处理数组的方式,重新调整每个行数组的大小相当简单。类似于我使用的模式是:

    function myFunction() {
     var array = [
      [1],
      [2,2],
      [3,5],
      [],
      [0,0,0,0],
      [],
      [0,0],
     ];
    
     // get length of the longest row
     var max = array
      .slice(0)
      .sort(function (a,b) {
        return ( (a.length !== b.length) ? 1 : 0 );
      })[0].length;
    
     // arrays are zero indexed
     var maxi = max-1;
    
     // insert a pointer at max index if none exists
     array = array
      .map(function (a){ 
        a[maxi] = a[maxi] || ""; 
        return a; 
      });
    
     Logger.log(array);
    }
    

    【讨论】:

    • 当心! a[maxi] = a[maxi] || "" 中的短路逻辑将用空字符串替换 0 之类的虚假值,这可能不是您想要的。请改用严格相等:if (a[maxi] === undefined) {a[maxi] = "";}。 (另外,您可以将return a.length &lt; b.length ? 1 : a.length &gt; b.length ? -1 : 0; 替换为return b.length - a.length,因为如果b 更大,则需要一个正数,如果a 更大,则需要一个负数,如果它们相同,则0。跨度>
    • @browly - SO 接电话的危险。
    • @Manohar 请参阅我之前的评论。关键问题是a[maxi] = a[maxi] || ""; 不会正确填充数组。它将[0,0,0,0] 更改为[0,0,0,""]。此外,您的排序功能将不起作用。当ab 长时,它需要返回一个负值。最简洁的方法是b.length - a.length。所需的输出是[[1, null, null, ""], [2, 2, null,""], [3, 5, null,""], [null, null, null,""], [0, 0, 0,0], [null, null, null,""], [0, 0, null,""]]。你的脚本输出[[1], [2, 2], [3, 5], [], ["", 0, 0, 0], [], ["",0]]
    • @browly 嗯,我想,我只是编辑/翻译了作者写的内容。不想在作者不知情的情况下改变他的思想意义。我对答案的一般看法是“我根本不喜欢这个答案”:-),我不会编写看起来像这样的代码,但谁知道作者的深刻想法是什么。现在最适合你说话的人是作者本人。
    • @Manohar 不,作者写了a.length &lt; b.length ? 1 : a.length &gt; b.length ? -1 : 0;,当ab 长时返回-1。您写的内容只会返回10,绝不会返回-1。不一样。
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2021-05-20
    • 2019-12-17
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2015-05-19
    相关资源
    最近更新 更多