如何将多个IMPORTXML结果动态合并为单个数组?
动态提取多季RPG场景数据到单个数组的解决方案
问题背景
我尝试将多季RPG场景数据导入单个数组,但一直遇到阻碍。目前我能用以下公式获取目标URL列表:
=ARRAYFORMULA( "https://pathfinderwiki.com/" & QUERY( IMPORTXML( "https://pathfinderwiki.com/wiki/Pathfinder_Society_(second_edition)", "/html/body/div[1]/div/div[4]/main/div/div[2]/div[1]/dl[position()>=2]/dd/div/i/a/@href", "en-US"), "select * where Col1 like '%Year_of%'", 0 ) )
把这些URL放到A列,再把统一的XPATH查询语句/html/body/div[1]/div/div[4]/main/div/div[2]/div[1]/table[1]/tbody/tr[position()>1]放到B列后,手动拼接公式能提取全部五季数据:
={ IMPORTXML(A2, B2, "en-US"); IMPORTXML(A3, B3, "en-US"); IMPORTXML(A4, B4, "en-US"); IMPORTXML(A5, B5, "en-US"); IMPORTXML(A6, B6, "en-US") }
但借助近年新增的数组函数,应该能实现动态提取,不用手动构建数组。我试过MAP、TOROW、WRAPCOLS以及SPLIT、JOIN、MOD等组合,但都没成功。想知道是否存在可行方案?
可行解决方案
方案1:BYROW + TOCOL(统一XPATH场景)
如果XPATH是固定的(比如只需要在B2单元格存放一次),用这个公式即可动态遍历所有URL并提取数据:
=TOCOL(BYROW(A2:A, LAMBDA(url, IF(url="",,IMPORTXML(url, B2, "en-US")))), 3)
BYROW逐个遍历A列的非空URL,对每个URL执行IMPORTXML提取对应数据TOCOL将多个IMPORTXML返回的二维数组扁平化合并成单列,参数3用于过滤空值和错误结果
方案2:MAP + TOCOL(多XPATH场景)
如果每个URL需要对应不同的XPATH(B列每行都有对应语句),可以用MAP同时遍历两列:
=TOCOL(MAP(A2:A, B2:B, LAMBDA(url, xpath, IF(url="",,IMPORTXML(url, xpath, "en-US")))), 3)
MAP成对读取A列URL和B列XPATH,执行提取操作TOCOL同样负责合并结果并过滤无效内容
保留多列结构
如果需要保留原表格的多列格式,先确认每个IMPORTXML返回的列数(比如5列),用WRAPCOLS重新组合数据:
=WRAPCOLS(TOCOL(BYROW(A2:A, LAMBDA(url, IF(url="",,IMPORTXML(url, B2, "en-US")))), 3), 5)
将公式中的5替换成实际提取的列数即可。
内容的提问来源于stack exchange,提问作者volfied
相关产品推荐
相关产品推荐

