如何使用ImportJSON将Lichess.org国际象棋赛事数据导入Google Sheets
关于ImportXML无法提取页面数据的问题
即便你在页面源码中能看到用户名、得分相关的字符串,也大概率无法通过ImportXML直接提取:
Lichess的赛事页面数据多数是嵌入在<script>标签中的JS变量,不属于标准HTML DOM节点。ImportXML仅支持通过XPath定位结构化的XML/HTML节点,无法直接解析JS代码内的JSON片段,即便你用XPath拿到了完整的script标签文本,也需要额外用正则匹配字段,稳定性极差,不推荐使用该方案。
关于ImportJSON无法生效的原因
你猜测的原因是正确的,该API返回的是**NDJSON(换行分隔JSON)**格式,而非普通ImportJSON脚本支持的标准单JSON结构:
- 标准JSON的赛事结果会用外层数组包裹所有选手对象,整体是一个合法的JSON结构
- Lichess的结果API为了支持流式返回大数量数据,每一行是一个独立的选手JSON对象,没有外层数组包裹,常规JSON解析器会直接抛出格式错误,所以所有通用ImportJSON脚本都无法正常解析。
适配方案
直接使用自定义Google Apps Script处理NDJSON格式即可,操作步骤如下:
- 打开目标Google Sheets,点击顶部菜单栏「扩展程序」-「Apps脚本」,删除编辑器内的默认代码
- 粘贴如下代码:
function IMPORT_LICHESS_RESULTS(tournamentId, resultLimit = 3) { const requestUrl = `https://lichess.org/api/tournament/${tournamentId}/results?nb=${resultLimit}`; const response = UrlFetchApp.fetch(requestUrl); const ndjsonContent = response.getContentText(); // 拆分NDJSON行,过滤空行 const resultLines = ndjsonContent.split('\n').filter(line => line.trim()); const output = [['用户名', '得分']]; // 逐行解析JSON提取目标字段 resultLines.forEach(line => { const userData = JSON.parse(line); output.push([userData.username, userData.score]); }); return output; }
- 点击顶部保存按钮,给项目任意命名,首次运行需要按照提示完成权限授权(提示未验证应用时点击「高级」-「继续访问」即可,代码为自定义脚本无安全风险)
- 回到表格页面,在任意空白单元格输入公式
=IMPORT_LICHESS_RESULTS("赛事ID", 要获取的排名数量)即可,比如你要获取赛事NguuB8pO的前三名,输入=IMPORT_LICHESS_RESULTS("NguuB8pO",3)即可自动返回带表头的两列结果。
内容的提问来源于stack exchange,提问作者Michael Cohen
相关产品推荐
相关产品推荐

