-1

这个问题的续集:来自 chess.com 的实时统计 chess960?

所以假设我去喜欢

https://api.chess.com/pub/player/gmwso/games/2020/12

或者

https://api.chess.com/pub/player/gmwso/games/2020/12/pgn

会有一堆东西,比如说

[UTCDate "2018.01.03"]
[WhiteElo "2706"]
[BlackElo "2940"]

如何将此数据放入电子表格中,例如第 1 列是所有日期,第 2 列是相应的白色 elo,第 3 列是黑色 elo,col4 白色用户名和 col5 黑色用户名?


更新 2:现已修复。请参阅“json”与“预制”。哇。

更新 1:看起来 Mike Steelson 在这里有一个答案,其中代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

举个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

仅涉及 chess960 的情况似乎存在问题。例如考虑这个玩家:用玩家的用户名替换'gmwso'会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

4

1 回答 1

0

来自 lichess.org,假设 pgn 文件已加载到您的驱动器中(如果我直接从 lichess.org 捕获信息,谷歌警报“超过最大执行时间”)

// Mike Steelson

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('↓ lichess.org ↓')
    .addItem('parse PGN file from Drive', 'readPGNFromDrive')
    .addToUi();
}

function readPGNFromDrive() {

  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('from drive')
  var id = sh.getRange('B1').getValue()
  var list = ['Event', 'Site', 'Date', 'White', 'Black', 'Result', 'UTCDate', 'UTCTime', 'WhiteElo', 'BlackElo', 'WhiteRatingDiff', 'BlackRatingDiff', 'Variant', 'TimeControl', 'ECO', 'Termination', 'FEN', 'SetUp', 'sequence']

  sh.deleteRows(2,sh.getLastRow()+2)
  var result=[]
  result.push(list)
  var data = DriveApp.getFileById(id).getBlob().getDataAsString().split(String.fromCharCode(10,10,10))
  for (var i=0; i<data.length; i++) {
    var prov=[]
    var parts = data[i].split(String.fromCharCode(10,10))
    var pparts = parts[0].split(String.fromCharCode(10))
    for (var x=0; x<pparts.length; x++){
      pparts[x]=pparts[x].replace('[','"').replace(']','').replace(' "','":"') // "key":"value"
    }
    var donnees = JSON.parse('{'+pparts.join(',')+'}') // mise au format json
    list.forEach(function(path){
      if (path == 'sequence'){prov.push(parts[1])}
      else {prov.push(donnees.item(path))}
    })
    result.push(prov)
  }
  sh.getRange(2,1,result.length,result[0].length).setValues(result)
}

Object.prototype.item=function(i){return this[i]};

https://docs.google.com/spreadsheets/d/1ZX-YefSfeNx0z6mo7Bo3EY_tOkYcVLT7Ke0fqQUiHNI/copy

于 2021-08-13T11:32:48.000 回答