将 JSON API 导入 Google 表格

Import JSON API into Google Sheets

我需要将一些信息从 JSON API URL 导入到 Google 表格中。

这是一个例子:
https://api-apollo.pegaxy.io/v1/game-api/race/details/69357391

我已成功使用 Github 上的 IMPORTJSON 导入基本信息:
https://github.com/bradjasper/ImportJSON/

但现在我面对的是一种信息(是对象吗?数组?),这似乎与往常不同,我发现自己无法导入。

这是它的一部分:

{
        "id": 969228010,
        "raceId": 69357391,
        "pegaId": 20042,
        "gate": 8,
        "pegaAttributes": "{\"id\":20042,\"name\":\"Bajaj\",\"ownerId\":623299,\"raceClass\":1,\"races\":1369,\"win\":504,\"lose\":865,\"energy\":18,\"gender\":\"Male\",\"bloodLine\":\"Campona\",\"breedType\":\"Legendary\",\"speed\":4.95,\"strength\":0.33,\"wind\":3.36,\"water\":1.84,\"fire\":8.83,\"lighting\":6.93,\"position\":4000,\"finished\":true,\"raceTime\":35.855,\"result\":8,\"gate\":8,\"lastSpeed\":22.721521955555556,\"stage\":4,\"isTopSpeedReached\":false,\"bonusStage\":false,\"topSpeed\":22.721521955555556,\"s0\":0,\"j0\":-0.02,\"a0\":0.4982185622222222,\"v0\":20.127527583333332,\"t0\":179.60000000000002,\"gears\":{},\"pb\":0}"**,
        "position": 11,
        "raceTime": 35.855,
        "reward": 0
      },

所以使用 IMPORTJSON 如果我想简单地导入“raceId”元素,我会这样做:

=ImportJSON("https://api-apollo.pegaxy.io/v1/game-api/race/details/69357391", "/race/registers/raceId", "noHeaders")

但是当尝试从 pegaAttributes 中导入任何信息时,IMPORTJSON 无法将其识别为单独的。我能做的最好的就是像这样导入整个块:

=ImportJSON("https://api-apollo.pegaxy.io/v1/game-api/race/details/69357391", "/race/registers/pegaAttributes", "noHeaders")

所以 "pegaAttributes" 和括号 { } 之后的一些信息我需要导入。例如属性 raceTimetopSpeedlastSpeed 等等,如何将其导入到 Google 表格中?

任何人都可以提供有关如何执行此操作的任何指示吗?谢谢。

你必须解析它两次,因为它是一个对象,就像文本一样。我认为使用自定义公式可能并不简单,因为 Google App Scripts 可以非常干净地为您完成此操作。考虑使用标准 JSON.parse() 函数。

下面的函数为我提供了您正在寻找的以下值。查看调试屏幕截图。

function getJSONData(){
  const zURL = 'https://api-apollo.pegaxy.io/v1/game-api/race/details/69357391';
  var response = UrlFetchApp.fetch(zURL);
  var cleanedResponse = JSON.parse(response);
  var theRace = cleanedResponse['race'];
  var theRegisters = theRace['registers'];
  var aRegister = theRegisters[0];
  var oneID = oneRegister.id;
  var aGate = oneRegister.gate;
  var aPega = oneRegister.pegaAttributes;
  var cleanedPega = JSON.parse(aPega);
  var zTopSpeed = cleanedPega.topSpeed;

}

如果你调试这个,在你的变量中运行并检查到右边,你应该能够得到你需要的一切。您必须找到一种方法将其恢复到工作表中,但这些值可用。

已更新

有人请求弄清楚如何将其 运行 作为表格函数。利用迈克·斯蒂尔森 (Mike Steelson) 的方法和假设来确定比赛所需的内容……这是一个可以使用的功能。只需在公式中粘贴 URL。

function getDataMyJSON(theURL) {

  const data = JSON.parse(UrlFetchApp.fetch(theURL).getContentText())
  const items = ['raceTime','topSpeed','lastSpeed']
  let result=[]
  data.race.registers.forEach(x => {
    let prov = []
    prov.push(x.raceId)
    var p = JSON.parse(x.pegaAttributes)
    items.forEach(i => prov.push(p[i]))
    result.push(prov)
  })
  return result;
}

然后将 URL 放入公式中,你会得到这个...

尝试(您必须在 pegaAttributes 元素上应用 JSON.parse,这也是一个 json)

=importDataJSON(url,"id|position|raceTime","name|raceTime|topSpeed|lastSpeed")

function importDataJSON(url, items1, items2) {
  let result = []
  result = [[items1.split('|'), items2.split('|')].flat()]
  const obj = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  obj.race.registers.forEach(o => {
    let prov = []
    items1.split('|').forEach(item1 => prov.push(o[item1]))
    var pegaAttributes = JSON.parse(o.pegaAttributes)
    items2.split('|').forEach(item2 => prov.push(pegaAttributes[item2]))
    result.push(prov)
  })
  return result
}

作为参数:

  • url
  • items1(级别 1)由 |
  • 分隔
  • items2(级别 2,在 pegaAttributes 下)由 |
  • 分隔

新编辑

=importDataJSON(url,"totalReward|length","id|position|raceTime","name|raceTime|topSpeed|lastSpeed")

function importDataJSON(url, items0, items1, items2) {
  let result = []
  result = [[items0.split('|'), items1.split('|'), items2.split('|')].flat()]
  const obj = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  let prov = []
  items0.split('|').forEach(item0 => prov.push(obj.race[item0]))
  result.push(prov)
  obj.race.registers.forEach(o => {
    let prov = []
    items0.split('|').forEach(item0 => prov.push(''))
    items1.split('|').forEach(item1 => prov.push(o[item1]))
    var pegaAttributes = JSON.parse(o.pegaAttributes)
    items2.split('|').forEach(item2 => prov.push(pegaAttributes[item2]))
    result.push(prov)
  })
  return result
}