Google 应用程序脚本 returns 多行数组

Google App Script returns array over multiple rows

总结

我是 Google Apps Script 的新手,但我花了相当多的时间进行研究,但一无所获。基本上,我正在尝试复制 SQL 的 cross-join 功能。我有 2 个 table,一个日历 table 有 12 个月,一个客户 table 有 3 个客户。客户 table 是从 Google 表单中填充的,并且将在以后添加新客户。

对于我的报告,我需要按月提供客户数据。因此,我想 cross-join 客户数据与日历一起创建一个包含 36 行的数据集,其中每个客户有 12 行,每月一个。

根据我在 Whosebug 上找到的其他代码,我已经接近了。我现在的问题是我的两个数据集最终显示在后续行中,这似乎与我处理数组的方式有关。我也尝试使用 push.apply 和 .concat 得到完全相同的结果。

如有任何帮助,我们将不胜感激!可以找到工作簿here

此外,日历 table 并非绝对必要 - 我只是来自 SQL 背景,所以我的第一直觉是制作日历 table 并创建交叉连接.如果您能想到更好的方法来接受来自 Google 表单的单行客户数据并输出 X 行并添加连续的月份和年份,请告诉我!

免责声明: 我知道这种 cross-join 方法在 SQL 数据库中处理得更好,而 Google Sheets 则不然为此而设计。这是一个临时解决方法,同时正在设计更好的 long-term 解决方案。对于此解决方法,客户数据集的客户总数可能会少于 100 个,并且正在以大约每周 1 个客户的速度增长。


日历Table


客户Table


自定义代码

function crossJoin(tabl1, tabl2, header) {
 var output = [];
  var days = tabl1;
  var customer = tabl2;
  if(header) {output.push([header[0][1], header[0][0]])};
  for(var i = 1, iLen = customer.length; i < iLen; i++) {
//     output.push(days[i]);
    for(var j = 1, jLen = days.length; j < jLen; j++) { 
      output.push(days[j],customer[i]);

    }
  }
  return output;  
}


当前输出


期望的输出

您可以使用 concat 等数组方法来获得相同的结果。

代码片段:

function sqlCrossJoin(arr1, arr2) {
  arr1 = arr1 || [['jan', 1], ['feb', 2]];
  arr2 = arr2 || [
    ['Jane Doe', 1983, 'PortLand', 'Oregon'],
    ['John Smith', 1984, 'San Francisco', 'California'],
  ];
  var output = [];
  arr1.forEach(function(month) {
    arr2.forEach(function(customer) {
      output.push(month.concat(customer));
    });
  });
  return output;
/* Expected Output:
[ [ 'jan', 1, 'Jane Doe', 1983, 'PortLand', 'Oregon' ],
  [ 'jan', 1, 'John Smith', 1984, 'San Francisco', 'California' ],
  [ 'feb', 2, 'Jane Doe', 1983, 'PortLand', 'Oregon' ],
  [ 'feb', 2, 'John Smith', 1984, 'San Francisco', 'California' ] ]*/
}

参考文献: