如何将 convert/parse/extract 数据从 PGN 导入 spreadsheet/google sheet/excel 文件?

How do convert/parse/extract data from a PGN into a spreadsheet/google sheet/excel file?

Sequel 这个问题:

所以假设我去喜欢

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' 与 'preformed'。哇。

更新 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的情况下好像有问题。考虑例如 this player:用玩家的用户名替换 'gmwso' 会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

来自 lichess.org,假设 pgn 文件已加载到您的驱动器中(如果我直接从 lichess.org 捕获信息,google 警报 'Exceeded maximum execution time')

// 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