【问题标题】:How do I fetch and parse JSON data to Google Sheets Script?如何获取 JSON 数据并将其解析为 Google 表格脚本?
【发布时间】:2019-10-28 21:19:27
【问题描述】:

EDIT*** 既然我有合适的来源,就修改了问题...

我正在尝试将通信日志复制到 Google 表格,但对脚本(或 JSON)了解不足,无法完成此操作。我只想让电子表格模拟/复制可用的整个日志。

脚本运行并且没有错误,但电子表格中没有任何内容。 我尝试使用的代码 sn-p 在这里:

function pullJSON() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var sheet = ss.getActiveSheet();


var url="https://api.brandmeister.network/v1.0/repeater/?action=get&q=1148311"; // Paste your JSON URL here

var response = UrlFetchApp.fetch(url); // get feed
var dataAll = JSON.parse(response.getContentText()); //
var dataSet = dataAll;


var rows = [],
  data;


for (i = 0; i < dataSet.length; i++) {
data = dataSet[i];
rows.push([data.repeaterid, data.callsign]); //your JSON entities here
}

 data = sheet.getRange(1,1,99,10).getValues(); 
 sheet.getRange(1,1,99,10).setValues(data);

}

我想知道如何做到这一点,以及关于这个错误是什么以及为什么我得到它的教育解释,我正在努力学习而不仅仅是获得帮助。

电子表格是一个空白画布,所以如果我需要对其进行一些特殊处理以使脚本正常工作,能否也请解释一下?谢谢大家。

【问题讨论】:

  • 错误意味着您在response.getContentText() 中获得了一个 HTML,它不能被 JSON 解析,因此在尝试解析时抛出错误。
  • 那么即使url说是JSON查询不代表可以解析吗?努力学习,不要讽刺或搞笑。
  • 没问题。只需尝试在浏览器中启动该 URL。您可以看到 HTML 页面正在呈现,这意味着响应是 HTML 格式的。如果要为 JSON 查询返回所有 JSON,则需要在服务器上完成,现在没有发生。
  • 电子表格是空白的,我是否必须填写所有标题?

标签: javascript json parsing google-apps-script google-sheets


【解决方案1】:
  • 你想知道The script run and there are no errors, but nothing goes onto the spreadsheet.的原因。
  • 在您的脚本中,您希望将repeateridcallsign 的值从https://api.brandmeister.network/v1.0/repeater/?action=get&amp;q=1148311 的URL 中提取的数据中放入。

如果我的理解是正确的,那么这个答案呢?

答案 1:

本节解释The script run and there are no errors, but nothing goes onto the spreadsheet.的原因。

当我看到您的脚本时,会在您的脚本底部看到以下脚本。

data = sheet.getRange(1,1,99,10).getValues();
sheet.getRange(1,1,99,10).setValues(data);

这意味着getRange(1,1,99,10)检索到的数据放在同一个范围内。即,该范围被相同的值覆盖。从您的问题的The spreadsheet is a blank canvas 开始,范围的空值被放入相同的范围。并且其他部分的脚本没有出现错误。这就是The script run and there are no errors, but nothing goes onto the spreadsheet.的原因。

另外,在你的脚本中,rows 没有被使用。这样,即使rows 有您想要输入的值,这些值也不会输入到电子表格中。

答案 2:

在本节中,我修改了您的脚本,将repeateridcallsign 的值放在从https://api.brandmeister.network/v1.0/repeater/?action=get&amp;q=1148311 的URL 中提取的数据中。

当从https://api.brandmeister.network/v1.0/repeater/?action=get&amp;q=1148311的URL检索到的值如下。

{
  "repeaterid": "1148311",
  "callsign": "KD8YYA",
  "hardware": "Android:BlueDV",
  "firmware": "1.0.121-DVMEGA_HR3.07",
  "tx": "437.0000",
  "rx": "437.0000",
  "colorcode": "1",
  "status": "4",
  "lastKnownMaster": "3108",
  "lat": "0.000000",
  "lng": "0.000000",
  "city": "Somewhere",
  "website": "www.pa7lim.nl",
  "pep": null,
  "gain": null,
  "agl": "1",
  "priorityDescription": null,
  "description": null,
  "last_updated": "2019-06-14 15:46:09",
  "sysops": []
}

从您的rows.push([data.repeaterid, data.callsign]) 脚本中,我可以理解您可能想要检索repeateridcallsign 的值,并希望将这些值放入电子表格。为了检索它们,请按如下方式修改您的脚本。

修改脚本一:

function pullJSON() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var sheet = ss.getActiveSheet();
  var url="https://api.brandmeister.network/v1.0/repeater/?action=get&q=1148311"; // Paste your JSON URL here
  var response = UrlFetchApp.fetch(url); // get feed
  var dataAll = JSON.parse(response.getContentText());

  // I modified below.
  var row = [dataAll.repeaterid, dataAll.callsign]; // Retrieve values from JSON object of dataAll.
  sheet.appendRow(row); // Append the values to Spreadsheet.
}
  • 通过这个修改后的脚本,检索到的repeateridcallsign 被放到电子表格的活动表中。

修改脚本2:

function pullJSON() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var sheet = ss.getActiveSheet();
  var url="https://api.brandmeister.network/v1.0/repeater/?action=get&q=1148311"; // Paste your JSON URL here
  var response = UrlFetchApp.fetch(url); // get feed
  var dataAll = JSON.parse(response.getContentText());

  // I modified below.
  var rows = [Object.keys(dataAll)]; // Retrieve headers.
  var temp = [];
  for (var i = 0; i < rows[0].length; i++) {
    temp.push(dataAll[rows[0][i]]); // Retrieve values.
  }
  rows.push(temp);
  sheet.getRange(1,1,rows.length,rows[0].length).setValues(rows); // Put values to Spreadsheet.
}
  • 通过这个修改后的脚本,所有键和值都被放入电子表格中。

注意:

  • 在这种情况下,dataAll 不是一个数组。所以你下面的脚本,for循环不起作用。这样,rows 就变成了[]

    var dataSet = dataAll;
    var rows = [], data;
    for (i = 0; i < dataSet.length; i++) {
      data = dataSet[i];
      rows.push([data.repeaterid, data.callsign]); //your JSON entities here
    }
    
  • 根据您的问题,我不确定您想要将值放入电子表格的情况。如果要修改输出格式,请修改上面的脚本。

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 难以置信的解释!感谢您花时间解决这个问题并很好地解释它。我很高兴您指出了行问题,如果有的话,我需要数周时间才能弄清楚。
  • @Jae Nulton 感谢您的回复。我很高兴你的问题得到了解决。如果你能从中得到一些东西,我会更高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2022-07-06
  • 2022-09-25
  • 2023-03-05
相关资源
最近更新 更多