【问题标题】:Importing API data via importJSON通过 importJSON 导入 API 数据
【发布时间】:2021-09-21 23:26:39
【问题描述】:

第一次在 Google 表格中使用 importJSON 有点麻烦。我的数据以截断的形式导入,我找不到任何方法来真正按照我想要的方式过滤。

API 来源:https://prices.runescape.wiki/api/v1/osrs/1h

我正在使用以下命令:=IMPORTJSON(B1;B2) 其中 B1 是源链接,B2 引用了我应用的任何过滤器。到目前为止,我还没有过滤器。

我的结果是一个截断的列表,显示如下:

data/2/avgHighPrice 166
data/2/highPriceVolume  798801
data/2/avgLowPrice  162
data/2/lowPriceVolume   561908
data/6/avgHighPrice 182132
data/6/highPriceVolume  7
data/6/avgLowPrice  180261
data/6/lowPriceVolume   37
data/8/avgHighPrice 195209
data/8/highPriceVolume  4
data/8/avgLowPrice  192880
data/8/lowPriceVolume   40

在我见过和使用过的示例中(主要是插件提供的示例),它自然会转变成表格。我什至无法做到这一点,尽管我真的只是想 ping 标记 avgHighPrice 和 avgLowPrice。

编辑:

我正在寻找这样的结果:

2 6 8
/avgLowPrice 162 180261 192880
/avgHighPrice 166 182132 195209

EDIT2:

所以我还有一件事希望弄清楚。使用您的脚本,我创建了另一个脚本来提取名称和项目 ID

function naming(url){
  //var url='https://prices.runescape.wiki/api/v1/osrs/mapping'
  var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  var result = []
  result.push(['#','id','name'])
  for (let p in eval('data.data')) {
    try{result.push([p,data.item(p).ID,data.item(p).Name])}catch(e){}
  }
  return result
}
Object.prototype.item=function(i){return this[i]};

我想知道是否可以将项目名称与初始定价脚本中的项目 ID 关联起来。首先,第一个脚本仅列出可交易的物品,而第二个脚本列出游戏中的所有物品 ID。我基本上想将第一个和第二个脚本关联起来以显示

ID Name avgHighPrice avgLowPrice
2 Cannonball 180261 192880
6 Cannon Base 182132 195209

【问题讨论】:

  • 关于My result is a truncated list that displays as such:,你能在你的问题中显示你的预期结果吗?
  • 刚刚用我正在寻找的结果更新了我的帖子
  • 感谢您的回复。现在我注意到已经发布了答案。我认为它会解决您的问题。

标签: google-sheets google-sheets-formula google-sheets-api


【解决方案1】:

试试这个脚本(没有任何插件)

function prices(url){
  //var url='https://prices.runescape.wiki/api/v1/osrs/1h'
  var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  var result = []
  result.push(['#','avgHighPrice','avgLowPrice'])
  for (let p in eval('data.data')) {
    try{result.push([p,data.data.item(p).avgHighPrice,data.data.item(p).avgLowPrice])}catch(e){}
  }
  return result
}
Object.prototype.item=function(i){return this[i]};

您可以按如下方式从映射中检索命名/信息

function naming(url){
  //var url='https://prices.runescape.wiki/api/v1/osrs/mapping'
  var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  var result = []
  result.push(["id","name","examine","members","lowalch","limit","value","highalch"])
  json=eval('data')
  json.forEach(function(elem){
    result.push([elem.id.toString(),elem.name,elem.examine,elem.members,elem.lowalch,elem.limit,elem.value,elem.highalch])
  })
  return result
}

https://docs.google.com/spreadsheets/d/1HddcbLchYqwnsxKFT2tI4GFytL-LINA-3o9J3fvEPpE/copy

【讨论】:

  • 这很好用,谢谢。如果您愿意提供帮助,我还有一个问题,我编辑了我的初始帖子。
  • 没问题,我去看看。
  • mapping 的结构完全不同。我更新了我的答案。我不明白的是这两个网址之间的关系。我将仔细研究 Old School RuneScape 网站和 API。
  • 好的,我已经理解了 id 和 # 之间的联系……我已经更改了脚本,以便 ID 为字符串格式。
【解决方案2】:

综合功能

=pricesV2()

https://docs.google.com/spreadsheets/d/1HddcbLchYqwnsxKFT2tI4GFytL-LINA-3o9J3fvEPpE/copy

function pricesV2(){
  var url='https://prices.runescape.wiki/api/v1/osrs/mapping'
  var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  let myItems = new Map()
  json=eval('data')
  json.forEach(function(elem){myItems.set(elem.id.toString(),elem.name)})
  var url='https://prices.runescape.wiki/api/v1/osrs/1h'
  var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
  var result = []
  result.push(['#','name','avgHighPrice','avgLowPrice'])
  for (let p in eval('data.data')) {
    try{result.push([p,myItems.get(p),data.data.item(p).avgHighPrice,data.data.item(p).avgLowPrice])}catch(e){}
  }
  return result
}
Object.prototype.item=function(i){return this[i]};

【讨论】:

  • 这是巨大的!非常感谢迈克的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-10-31
  • 2019-03-04
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多