我有一个谷歌工作表,其中有一个带有数据“键”的列,然后是动态填充数据的水平列,我试图创建一个填充单元格的长“键值”数据对,这些是字符串,因此一些基于数字的黑客不起作用:/
数量 | A | B | C | D | E | F | G | H | 我 | J |
---|---|---|---|---|---|---|---|---|---|---|
1 | 钥匙1 | v1 | v2 | v3 | v4 | |||||
2 | 键2 | va1 | va2 | va3 | ||||||
3 | 键3 | vb1 | ||||||||
4 | 键3 | vc1 | vc2 | vc3 | vc4 | vc5 | vc6 | vc7 | vc8 | vc9 |
我的目标是把它变成2列纯粹的键值
数量 | A | B |
---|---|---|
1 | 钥匙1 | v1 |
2 | 钥匙1 | v2 |
3 | 钥匙1 | v3 |
... | ... | ... |
10 | 钥匙3 | vc1 |
11 | 钥匙3 | vc2 |
我尝试过各种“unpivot”解决方案,但它们往往需要静态列计数,而不是我将拥有的动态列计数
我相信您的目标如下。
Key3,vc1
。但是,从您的示例输入表中,我猜测第 10 行可能是 key3,vc2
。在这种情况下,下面的示例脚本怎么样?
请将以下脚本复制并粘贴到电子表格的脚本编辑器中,并设置工作表名称并保存脚本。
function myFunction() {
const sheetName = "Sheet1"; // Please set your sheet name.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
const range = sheet.getDataRange();
const values = range.getValues().flatMap(([h, ...v]) => v.filter(String).map(e => [h, e]));
range.clearContent();
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}
运行此脚本,得到以下结果。
该脚本覆盖了现有的单元格。但是,例如,如果您想放入第 10 行的结果值,请按如下方式替换上述脚本中的最后 2 行。
sheet.getRange(10, 1, values.length, values[0].length).setValues(values);