如何在 Google 电子表格中使用 ARRAYFORMULA + FILTER?
How to use ARRAYFORMULA + FILTER within Google Spreadsheet?
我有一个 Google spreadsheet,基本上是 key/value 对的字典。密钥是唯一的。一秒钟 sheet 我需要为字典中的每个键添加一行或多行,其中包含一些数据。在这个 sheet 中,我还需要报告每个键的正确值。
为此,我尝试将 ARRAYFORMULA 函数与第二行的第一行中的许多其他函数结合使用 sheet 以避免(如果可能)将相同的公式复制到所有值列的行数。
到目前为止,QUERY 和 FILTER 都不起作用。
QUERY 要求所有数据(包括 WHERE 谓词的参数)驻留在单个 sheet 上。在我的例子中,过滤键在第二个 sheet 上,而字典在第一个上。所以这个根本不能用
FILTER 与 ARRAYFORMULA 一起使用和不与它一起使用时(对我而言)似乎有一种奇怪的行为。
你可以看看我的测试Google Sheet
here 或此处使用 ARRAYFORMULA(B 列)、不使用它(C 列)以及我想要获得的内容(D 列)的快照:
从 pnuts 的解决方案再进一步提供 "perfect" 结果,但没有 "N/A" 个单元格:
=ARRAYFORMULA(IF(A3:A="";"";VLOOKUP(A3:A;KEYS!A1:B;2;FALSE)))
当然对性能有重大影响,因为 VLOOKUP 在第二个 sheet 中对每一行 运行 一次(这也是我尝试使用 FILTER 的原因).
即使使用当前链接的示例 sheet,这些性能也很低,这真的很瘦。
第 3 行请尝试:
=ArrayFormula(vlookup(A3:A;KEYS!A:B;2;0))
尝试:
=ARRAYFORMULA(IF(LEN(A3:A); VLOOKUP(A3:A;KEYS!A1:B;2;FALSE);))
只要在 A 列中输入值,就应该得到键。
您可以使用 From spreadsheet - On change
事件触发器来调用如下代码:
function CopyPasteWastageRows() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName("<<Sheet-Name>>");
spreadsheet.getRange('Q2').activate();
var currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
spreadsheet.getRange('Q2').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
spreadsheet.getRange('Q2').activate();
};
我有一个 Google spreadsheet,基本上是 key/value 对的字典。密钥是唯一的。一秒钟 sheet 我需要为字典中的每个键添加一行或多行,其中包含一些数据。在这个 sheet 中,我还需要报告每个键的正确值。
为此,我尝试将 ARRAYFORMULA 函数与第二行的第一行中的许多其他函数结合使用 sheet 以避免(如果可能)将相同的公式复制到所有值列的行数。
到目前为止,QUERY 和 FILTER 都不起作用。
QUERY 要求所有数据(包括 WHERE 谓词的参数)驻留在单个 sheet 上。在我的例子中,过滤键在第二个 sheet 上,而字典在第一个上。所以这个根本不能用
FILTER 与 ARRAYFORMULA 一起使用和不与它一起使用时(对我而言)似乎有一种奇怪的行为。
你可以看看我的测试Google Sheet here 或此处使用 ARRAYFORMULA(B 列)、不使用它(C 列)以及我想要获得的内容(D 列)的快照:
从 pnuts 的解决方案再进一步提供 "perfect" 结果,但没有 "N/A" 个单元格:
=ARRAYFORMULA(IF(A3:A="";"";VLOOKUP(A3:A;KEYS!A1:B;2;FALSE)))
当然对性能有重大影响,因为 VLOOKUP 在第二个 sheet 中对每一行 运行 一次(这也是我尝试使用 FILTER 的原因). 即使使用当前链接的示例 sheet,这些性能也很低,这真的很瘦。
第 3 行请尝试:
=ArrayFormula(vlookup(A3:A;KEYS!A:B;2;0))
尝试:
=ARRAYFORMULA(IF(LEN(A3:A); VLOOKUP(A3:A;KEYS!A1:B;2;FALSE);))
只要在 A 列中输入值,就应该得到键。
您可以使用 From spreadsheet - On change
事件触发器来调用如下代码:
function CopyPasteWastageRows() {
var spreadsheet = SpreadsheetApp.getActive().getSheetByName("<<Sheet-Name>>");
spreadsheet.getRange('Q2').activate();
var currentCell = spreadsheet.getCurrentCell();
spreadsheet.getSelection().getNextDataRange(SpreadsheetApp.Direction.DOWN).activate();
currentCell.activateAsCurrentCell();
spreadsheet.getRange('Q2').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
spreadsheet.getRange('Q2').activate();
};