Google Sheets多工作表:嵌套Filter/Query实现公司发票详情展示
解决方案:按公司ID展示所有发票详情
方法一:使用公式直接实现(无需修改表格结构)
你可以通过IN操作符嵌套两个FILTER,结合TEXTJOIN来在单个单元格中合并某公司的所有发票详情:
=TEXTJOIN(CHAR(10), TRUE, FILTER(InvDetails!B:B, InvDetails!A:A IN FILTER(Invoices!B:B, Invoices!A:A=CompanyInfo!A2)))
公式说明:
- 内层
FILTER(Invoices!B:B, Invoices!A:A=CompanyInfo!A2):提取目标公司(CompanyInfo!A2)对应的所有发票号 InvDetails!A:A IN [...]:筛选出发票详情表中,发票号属于上述结果的行TEXTJOIN(CHAR(10), TRUE, ...):将所有匹配的详情用换行符(CHAR(10))合并,TRUE参数会自动忽略空值
如果需要更灵活的格式控制,也可以用QUERY函数关联两张表:
=TEXTJOIN(CHAR(10), TRUE, QUERY({Invoices!A:B, InvDetails!A:B}, "SELECT Col4 WHERE Col1='"&CompanyInfo!A2&"' AND Col2=Col3", 0))
方法二:用Apps Script给InvDetails表添加公司ID字段(更易维护)
如果需要长期方便过滤,可以通过脚本给InvDetails表批量添加对应公司ID,之后就能直接用简单的FILTER实现需求:
步骤1:添加脚本
- 打开你的Google表格,点击顶部菜单「扩展程序」→「Apps 脚本」
- 清空默认代码,粘贴以下脚本:
function addCompanyIdToInvDetails() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const invoicesSheet = ss.getSheetByName('Invoices'); const invDetailsSheet = ss.getSheetByName('InvDetails'); // 构建发票号→公司ID的映射表 const invoiceMap = {}; invoicesSheet.getDataRange().getValues().forEach(row => { if (row[0] && row[1]) invoiceMap[row[1]] = row[0]; }); // 给详情表添加公司ID列 const updatedData = invDetailsSheet.getDataRange().getValues().map((row, idx) => { if (idx === 0) return ['Company ID', ...row]; // 表头 const companyId = invoiceMap[row[0]] || ''; return [companyId, ...row]; }); // 更新表格内容 invDetailsSheet.clearContents(); invDetailsSheet.getRange(1, 1, updatedData.length, updatedData[0].length).setValues(updatedData); }
- 点击工具栏的「运行」按钮,首次运行需要授权脚本访问你的表格数据
步骤2:使用新增字段过滤
脚本运行后,InvDetails表最左侧会新增「Company ID」列,之后直接用以下公式就能获取某公司的所有发票详情:
=TEXTJOIN(CHAR(10), TRUE, FILTER(InvDetails!C:C, InvDetails!A:A=CompanyInfo!A2))
内容的提问来源于stack exchange,提问作者Remmerboy
相关产品推荐
相关产品推荐

