如何获取 JSON 数据并将其解析到 Google Sheets 脚本?

Jae*_*ton 4 javascript parsing json google-sheets google-apps-script

编辑*** 现在我有了正确的来源,修改了问题......

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

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

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);

}
Run Code Online (Sandbox Code Playgroud)

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

电子表格是一个空白画布,所以如果我需要对其做一些特殊的事情以使脚本正常工作,是否也可以解释一下?谢谢你们。

Tan*_*ike 5

  • 你想知道原因The script run and there are no errors, but nothing goes onto the spreadsheet.
  • 在您的脚本中,您希望将从 的 URL 获取的数据中放入repeaterid和的值。callsignhttps://api.brandmeister.network/v1.0/repeater/?action=get&q=1148311

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

答案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);
Run Code Online (Sandbox Code Playgroud)

这意味着检索到的数据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:

在本节中,我修改了您的脚本,以将从 URL 获取的数据中的repeaterid和的值放入其中。callsignhttps://api.brandmeister.network/v1.0/repeater/?action=get&q=1148311

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

{
  "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": []
}
Run Code Online (Sandbox Code Playgroud)

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

修改后的脚本1:

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.
}
Run Code Online (Sandbox Code Playgroud)
  • 通过此修改后的脚本,检索的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.
}
Run Code Online (Sandbox Code Playgroud)
  • 通过此修改后的脚本,所有键和值都将放入电子表格中。

笔记:

  • 在本例中,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
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 从你的问题来看,我不确定你想要将哪些值放入电子表格的情况。如果要修改输出格式,请修改上面的脚本。

参考:

如果我误解了你的问题并且这不是你想要的方向,我很抱歉。

  • 令人难以置信的解释!感谢您花时间解决这个问题并对其进行了如此详尽的解释。我很高兴你指出了行问题,如果有的话,我需要几周的时间才能弄清楚。 (2认同)