Javascript 如何使用Google脚本和Google工作表执行Cartersian连接?
我已经找到了一个基本的2列笛卡尔连接的代码,但我有一个稍微不同的情况 有3个变量/列:颜色、颜色ID和项目 我想要各种颜色和物品的组合。我希望第三个变量,颜色ID与颜色变量一起连接到臀部 下面是一个示例电子表格。A-C列为输入数据,E-G列为所需输出顺序,不重要Javascript 如何使用Google脚本和Google工作表执行Cartersian连接?,javascript,google-apps-script,google-sheets,google-sheets-formula,cartesian-product,Javascript,Google Apps Script,Google Sheets,Google Sheets Formula,Cartesian Product,我已经找到了一个基本的2列笛卡尔连接的代码,但我有一个稍微不同的情况 有3个变量/列:颜色、颜色ID和项目 我想要各种颜色和物品的组合。我希望第三个变量,颜色ID与颜色变量一起连接到臀部 下面是一个示例电子表格。A-C列为输入数据,E-G列为所需输出顺序,不重要 我相信你的目标如下 您希望使用GoogleApps脚本实现以下转换 从 到 在您的示例电子表格中,Green,55的值与Backpack的值完全相同。但从您的示例模式来看,我认为您可能想要avove转换 如果我的理解是正确的,我想提出以
我相信你的目标如下 您希望使用GoogleApps脚本实现以下转换 从 到 在您的示例电子表格中,Green,55的值与Backpack的值完全相同。但从您的示例模式来看,我认为您可能想要avove转换 如果我的理解是正确的,我想提出以下流程 从A到C列检索值。 转置检索到的值。 创建用于放入电子表格的数组。 输入值。 当上述流程反映到脚本中时,它将变成如下所示 示例脚本: 请将以下脚本复制并粘贴到电子表格的脚本编辑器中,然后运行myFunction。这样,结果值被放入列I2:K
function myFunction() {
const sheetName = "Sheet1"; // Please set the sheet name.
// 1. Retrieve the values from the columns "A" to "C".
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const values = sheet.getRange("A2:C" + sheet.getLastRow()).getValues();
// 2. Transpose the retrieved values.
const [color, id, item] = values[0].map((_, i) => values.map(r => r[i]).filter(String));
// 3. Create the array for putting to Spreadsheet.
const res = color.flatMap((e, i) => item.map(g => [e, id[i], g]));
// 4. Put the values.
sheet.getRange(2, 9, res.length, res[0].length).setValues(res);
}
结果:
当为示例电子表格运行上述脚本时,将获得以下结果
参考资料:
很好,请接受他的回答,但这只是为了防止您想在工作表中使用此公式作为自定义函数公式:
function cartesian(startCol) {
const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const vals = sh.getRange(2, startCol, sh.getLastRow(),3).getValues();
const input = [...Array(3)].map((_, i) =>
vals.map(r => r[i]).
filter(e=>e!=''));
const res = input[0].map((color, i) =>
input[2].
map(item => [color, input[1][i], item])).
flat();
return res;
}
然后使用=cartesianstartCol,其中startCol在您的案例中为1,作为输入数据的第一列:
作为一个简单的谷歌表单公式
使用分隔符连接A&B请使用表格来提供数据结构,而不是工作表的链接。您能否详细说明如何在开放范围内使用INDEX/COUNTA?我想用A2:INDEXA2:A、COUNTAA2:A等来切换A2:A4会起作用,但这不起作用。也非常感谢您提供这个解决方案,它非常酷。@Wellwoah这应该可以解决问题。你能告诉我修改过的全部公式和错误吗?
function myFunction() {
const sheetName = "Sheet1"; // Please set the sheet name.
// 1. Retrieve the values from the columns "A" to "C".
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const values = sheet.getRange("A2:C" + sheet.getLastRow()).getValues();
// 2. Transpose the retrieved values.
const [color, id, item] = values[0].map((_, i) => values.map(r => r[i]).filter(String));
// 3. Create the array for putting to Spreadsheet.
const res = color.flatMap((e, i) => item.map(g => [e, id[i], g]));
// 4. Put the values.
sheet.getRange(2, 9, res.length, res[0].length).setValues(res);
}
function cartesian(startCol) {
const sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const vals = sh.getRange(2, startCol, sh.getLastRow(),3).getValues();
const input = [...Array(3)].map((_, i) =>
vals.map(r => r[i]).
filter(e=>e!=''));
const res = input[0].map((color, i) =>
input[2].
map(item => [color, input[1][i], item])).
flat();
return res;
}