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' ] ]*/
}
参考文献:
总结
我是 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' ] ]*/
}