通过 importJSON 导入 API 数据
Importing Importing API data via importJSON
这是我的代码:
function pricesV2(){
var url='https://prices.runescape.wiki/api/v1/osrs/mapping'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
let myItems = new Map()
let myItem = new Map1()
json=eval('data')
json.forEach(function(elem){myItems.set(elem.id.toString(),elem.name)})
json.forEach(function(elem){myItem.set(elem.id.toString(),elem.examine)})
var url='https://prices.runescape.wiki/api/v1/osrs/latest'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
var result = []
result.push(['#','name','examine','high','low','lowTime', 'highTime'])
for (let p in eval('data.data')) {
try{result.push([p,myItems.get(p),myItem.get(p),data.data.item(p).high,data.data.item(p).low,convertTimestamp(data.data.item(p).lowTime),convertTimestamp(data.data.item(p).highTime)])}catch(e){}
}
return result
}
了解 API:
的变量可能很重要
function prices(url){
//var url='https://prices.runescape.wiki/api/v1/osrs/latest'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
var result = []
result.push(['#','high','low','highTime','lowTime'])
for (let p in eval('data.data')) {
try{result.push([p,data.data.item(p).high,data.data.item(p).low,data.data.item(p).lowTime, ,data.data.item(p).highTime])}catch(e){}
}
return result
}
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
}
这些是 2 API 组合(Importing API data via importJSON,解决方案确实适用于 1 个元素,(element.name))。但是当我想从映射中添加更多内容时,它会出错。有人可以帮帮我吗?我想将所有结果合并为一个 table.
我相信你的目标如下。
- 您想将 2 个返回数据(JSON 数据)与
id
的值相结合。
- 根据您对
The colums doesn't need in this specific order.
的回复,您不需要检查列的顺序。
- 您想 运行 将脚本作为自定义函数。
- 根据您的展示脚本,我认为您可能想将此脚本用作自定义函数。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
请将以下脚本复制并粘贴到电子表格的脚本编辑器中。并且,请将自定义函数 =SAMPLE()
放入单元格。这样,脚本就是运行.
function SAMPLE() {
const url1 = "https://prices.runescape.wiki/api/v1/osrs/mapping";
const url2 = "https://prices.runescape.wiki/api/v1/osrs/latest";
const [res1, res2] = [url1, url2].map(url => JSON.parse(UrlFetchApp.fetch(url).getContentText()));
const head = [...Object.keys(res1[0]), ...Object.keys(res2.data[Object.keys(res2.data)[0]])];
const obj1 = res1.reduce((o, e) => (o[e.id] = e, o), {});
const obj2 = Object.entries(res2.data).reduce((o, [k, v]) => (o[k] = v, o), {});
const keys = Object.keys(obj1).map(e => Number(e)).sort((a, b) => a - b);
const values = [head, ...keys.map(k => {
const o = Object.assign(obj1[k], obj2[k]);
return head.map(h => o[h] || "");
})];
return values;
}
测试:
当此脚本为运行时,得到如下结果
注:
如果要设置列的具体顺序,请修改上面脚本中的head
。
=SAMPLE()
的自定义函数放入单元格时,如果出现错误,请重新打开Spreadsheet重新测试
如果你想直接将值放入电子表格而不是自定义函数,请修改脚本。
参考文献:
已添加:
来自以下3个新问题,
- Now how can I change like the top row to- > id, name, examine, members, lowalch, highalch, limit, high, low, lowtime, hightime? How can this be done in the function head, can't edit them individualy?
- And also how can I format/convert highTime and lowTime to time (hh:mm:ss)?
从The colums doesn't need in this specific order.
开始,我没有检查专栏的顺序。在那种情况下,正如我在回答中已经提到的,请按如下方式修改 head
。关于你的第二个新问题,在这种情况下,请按如下方式解析unix时间。
所以,当这两个新问题反映在我的示例脚本中时,它就变成了如下。
示例脚本:
function SAMPLE() {
const url1 = "https://prices.runescape.wiki/api/v1/osrs/mapping";
const url2 = "https://prices.runescape.wiki/api/v1/osrs/latest";
const [res1, res2] = [url1, url2].map(url => JSON.parse(UrlFetchApp.fetch(url).getContentText()));
const head = ['id', 'name', 'examine', 'members', 'lowalch', 'highalch', 'limit', 'high', 'low', 'lowTime', 'highTime'];
const obj1 = res1.reduce((o, e) => (o[e.id] = e, o), {});
const obj2 = Object.entries(res2.data).reduce((o, [k, v]) => (o[k] = v, o), {});
const keys = Object.keys(obj1).map(e => Number(e)).sort((a, b) => a - b);
const timeZone = Session.getScriptTimeZone();
const values = [head, ...keys.map(k => {
const o = Object.assign(obj1[k], obj2[k]);
return head.map(h => o[h] ? (['lowTime', 'highTime'].includes(h) ? Utilities.formatDate(new Date(o[h] * 1000), timeZone, "HH:mm:ss") : o[h]) : "");
})];
return values;
}
注:
关于你接下来的第三个问题,
- How can this database also be added <prices.runescape.wiki/api/v1/osrs/volumes>?
- 我认为这是一个新问题。在这种情况下,请 post 作为一个新问题。
这是我的代码:
function pricesV2(){
var url='https://prices.runescape.wiki/api/v1/osrs/mapping'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
let myItems = new Map()
let myItem = new Map1()
json=eval('data')
json.forEach(function(elem){myItems.set(elem.id.toString(),elem.name)})
json.forEach(function(elem){myItem.set(elem.id.toString(),elem.examine)})
var url='https://prices.runescape.wiki/api/v1/osrs/latest'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
var result = []
result.push(['#','name','examine','high','low','lowTime', 'highTime'])
for (let p in eval('data.data')) {
try{result.push([p,myItems.get(p),myItem.get(p),data.data.item(p).high,data.data.item(p).low,convertTimestamp(data.data.item(p).lowTime),convertTimestamp(data.data.item(p).highTime)])}catch(e){}
}
return result
}
了解 API:
的变量可能很重要function prices(url){
//var url='https://prices.runescape.wiki/api/v1/osrs/latest'
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText())
var result = []
result.push(['#','high','low','highTime','lowTime'])
for (let p in eval('data.data')) {
try{result.push([p,data.data.item(p).high,data.data.item(p).low,data.data.item(p).lowTime, ,data.data.item(p).highTime])}catch(e){}
}
return result
}
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
}
这些是 2 API 组合(Importing API data via importJSON,解决方案确实适用于 1 个元素,(element.name))。但是当我想从映射中添加更多内容时,它会出错。有人可以帮帮我吗?我想将所有结果合并为一个 table.
我相信你的目标如下。
- 您想将 2 个返回数据(JSON 数据)与
id
的值相结合。 - 根据您对
The colums doesn't need in this specific order.
的回复,您不需要检查列的顺序。 - 您想 运行 将脚本作为自定义函数。
- 根据您的展示脚本,我认为您可能想将此脚本用作自定义函数。
在这种情况下,下面的示例脚本怎么样?
示例脚本:
请将以下脚本复制并粘贴到电子表格的脚本编辑器中。并且,请将自定义函数 =SAMPLE()
放入单元格。这样,脚本就是运行.
function SAMPLE() {
const url1 = "https://prices.runescape.wiki/api/v1/osrs/mapping";
const url2 = "https://prices.runescape.wiki/api/v1/osrs/latest";
const [res1, res2] = [url1, url2].map(url => JSON.parse(UrlFetchApp.fetch(url).getContentText()));
const head = [...Object.keys(res1[0]), ...Object.keys(res2.data[Object.keys(res2.data)[0]])];
const obj1 = res1.reduce((o, e) => (o[e.id] = e, o), {});
const obj2 = Object.entries(res2.data).reduce((o, [k, v]) => (o[k] = v, o), {});
const keys = Object.keys(obj1).map(e => Number(e)).sort((a, b) => a - b);
const values = [head, ...keys.map(k => {
const o = Object.assign(obj1[k], obj2[k]);
return head.map(h => o[h] || "");
})];
return values;
}
测试:
当此脚本为运行时,得到如下结果
注:
如果要设置列的具体顺序,请修改上面脚本中的
head
。=SAMPLE()
的自定义函数放入单元格时,如果出现错误,请重新打开Spreadsheet重新测试如果你想直接将值放入电子表格而不是自定义函数,请修改脚本。
参考文献:
已添加:
来自以下3个新问题,
- Now how can I change like the top row to- > id, name, examine, members, lowalch, highalch, limit, high, low, lowtime, hightime? How can this be done in the function head, can't edit them individualy?
- And also how can I format/convert highTime and lowTime to time (hh:mm:ss)?
从The colums doesn't need in this specific order.
开始,我没有检查专栏的顺序。在那种情况下,正如我在回答中已经提到的,请按如下方式修改 head
。关于你的第二个新问题,在这种情况下,请按如下方式解析unix时间。
所以,当这两个新问题反映在我的示例脚本中时,它就变成了如下。
示例脚本:
function SAMPLE() {
const url1 = "https://prices.runescape.wiki/api/v1/osrs/mapping";
const url2 = "https://prices.runescape.wiki/api/v1/osrs/latest";
const [res1, res2] = [url1, url2].map(url => JSON.parse(UrlFetchApp.fetch(url).getContentText()));
const head = ['id', 'name', 'examine', 'members', 'lowalch', 'highalch', 'limit', 'high', 'low', 'lowTime', 'highTime'];
const obj1 = res1.reduce((o, e) => (o[e.id] = e, o), {});
const obj2 = Object.entries(res2.data).reduce((o, [k, v]) => (o[k] = v, o), {});
const keys = Object.keys(obj1).map(e => Number(e)).sort((a, b) => a - b);
const timeZone = Session.getScriptTimeZone();
const values = [head, ...keys.map(k => {
const o = Object.assign(obj1[k], obj2[k]);
return head.map(h => o[h] ? (['lowTime', 'highTime'].includes(h) ? Utilities.formatDate(new Date(o[h] * 1000), timeZone, "HH:mm:ss") : o[h]) : "");
})];
return values;
}
注:
关于你接下来的第三个问题,
- How can this database also be added <prices.runescape.wiki/api/v1/osrs/volumes>?
- 我认为这是一个新问题。在这种情况下,请 post 作为一个新问题。