Javascript 如何使用Google脚本和Google工作表执行Cartersian连接?

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转换 如果我的理解是正确的,我想提出以

我已经找到了一个基本的2列笛卡尔连接的代码,但我有一个稍微不同的情况

有3个变量/列:颜色、颜色ID和项目

我想要各种颜色和物品的组合。我希望第三个变量,颜色ID与颜色变量一起连接到臀部

下面是一个示例电子表格。A-C列为输入数据,E-G列为所需输出顺序,不重要


我相信你的目标如下

您希望使用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;
}