从Google Apps脚本返回2D数组

时间:2018-12-13 11:24:16

标签: google-apps-script google-sheets

我正在尝试将长数组分成Google表格中的多列(2D)数组。这是我的以下功能:

function SPLITARR(data, colNum) {
  if (colNum <= 1) {
    return data;
  }

  var res = [];
  var col = [];
  var i = 0;

  data.forEach(function(el) {
    if (i >= colNum) {
      res.push(col);
      col = [];
      i = 0;
    }

    col.push(el);
    i++;
  });

  res.push(col);
  Logger.log(res); // Debugging purposes.
  return res;
}

发送以下测试数据:

var test = ['alex', 'alecia', 'conrad', 'keenan', 'Beebo', 'jacques', 'jeremy', 'susan', 'jay']
SPLITARR(test, 2);

正在记录的结果似乎正确:

[[alex, alecia], [conrad, keenan], [Beebo, jacques], [jeremy, susan], [jay]]

但是在Google表格上,没有任何显示。该公式不显示任何错误,并填充期望的单元格数量,但不填充任何内容。

2D阵列是否需要遵循特定格式才能正确显示?

2 个答案:

答案 0 :(得分:1)

问题:

D18:D23看起来不像test['alex', 'alecia', 'conrad', 'keenan', 'Beebo', 'jacques', 'jeremy', 'susan', 'jay'])。这是一个二维数组。看起来像:[[D18],[D19],[D20],[D21],[D22],[D23]]

解决方案:

使用reduce()concat()push()之类的数组方法将数组模制成所需的格式。

示例代码(用于单列中的多行):

function SPLITARR(rowData, numberOfCol) {
  return rowData.reduce(function(acc, curr, idx) {
    idx % numberOfCol === 0
      ? acc.push(curr)
      : (acc[acc.length - 1] = acc[acc.length - 1].concat(curr));
    return acc;
  }, []);
}

参考文献:

答案 1 :(得分:0)

请尝试使用此代码,如注释中所述,您应该为2D数组使用矩形图案,因此不能将[jay]作为最后一个元素,还请注意,如果没有名字,则不应使用名称引号-应该是[alex,alecia]而不是['alex','alecia']

function arraytoarray2d() {
var array2d = [];
var arrayx = ['alex', 'alecia', 'conrad', 'keenan', 'Beebo', 'jacques', 'jeremy', 'susan', 'jay']
for (var i in arrayx) {
  if (i % 2 == 0 || i == 0) {
var first = arrayx[i];
var second = arrayx[++i];
if(!second) second = ''; 
array2d.push([first,second]);
}}
}

输出以下内容:

enter image description here