【发布时间】:2022-02-02 16:05:23
【问题描述】:
【问题讨论】:
【问题讨论】:
试试这个。请注意,我对每列使用一个 while 循环,以防它们的高度不同。如果它们的高度相同,getDataRange() 将返回最后填充的行,所以我需要添加一个空行来停止 while 循环。
function mapper() {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName("Sheet3");
// assuming output isn't there yet range=A1:D4
var data = sh.getDataRange().getValues();
data.push(["","","",""]); // push an empty row to be safe
var i = 1;
var j = 1;
var k = 1;
var rows = [];
while( data[i][0] !== "" ) {
j = 1;
while( data[j][2] !== "" ) {
k = 1;
while( data[k][3] !== "" ) {
rows.push([data[i][0],data[j][2],data[k][3]]);
k++;
}
j++;
}
i++;
}
// put results in F2
sh.getRange(2,6,rows.length,rows[0].length).setValues(rows);
}
catch(err) {
Logger.log(err);
}
}
【讨论】:
我相信您要查找的是 A、C 和 D 列的笛卡尔积。
在这里,我在Cartesian product of multiple arrays in JavaScript 上针对您的问题实施了 rsp 回答。
代码:
function myFunction() {
var sh = SpreadsheetApp.getActiveSheet();
var nameRangeLastRow = sh.getRange("A1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
var nameVal = sh.getRange(2, 1, nameRangeLastRow - 1, 1).getValues().flat();
var regionRangeLastRow = sh.getRange("C1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
var regionVal = sh.getRange(2, 3, regionRangeLastRow - 1, 1).getValues().flat();
var positionRangeLastRow = sh.getRange("D1").getNextDataCell(SpreadsheetApp.Direction.DOWN).getLastRow();
var positionVal = sh.getRange(2, 4, positionRangeLastRow - 1, 1).getValues().flat();
const cartesian = (...a) => a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));
var result = cartesian(nameVal, regionVal, positionVal);
sh.getRange(2, 6, result.length, 3).setValues(result);
}
输出:
【讨论】: