将 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"
和括号 { }
之后的一些信息我需要导入。例如属性 raceTime
、topSpeed
、lastSpeed
等等,如何将其导入到 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
}
我需要将一些信息从 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"
和括号 { }
之后的一些信息我需要导入。例如属性 raceTime
、topSpeed
、lastSpeed
等等,如何将其导入到 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
}