无法将 JSON 数据的值设置为分隔单元格

Cannot Set Value of JSON Data to Separate Cells

我编写了以下脚本,它可以很好地提取所有数据。但是当我尝试将它分解成不同的单元格时,它 returns 什么都没有。我在这里错过了什么?

function myMonitor() {
//GET KEY

var sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“NINFO”);
**var rowNum = sh.getRange(‘F6’).getValue(); **

//POST CALL

** var url = “http://monitor.incognito.org/pubkeystat/stat”; **
** var data = { “mpk”: rowNum**
** };**

** var options = {**
** ‘method’ : ‘post’,**
** ‘contentType’: ‘application/json’,**
** ‘payload’ : JSON.stringify(data)**
** };**

** var response = UrlFetchApp.fetch(url, options);**
** var txt= response.getContentText();**
** var d=JSON.parse(txt);**

//RETURN RESULTS BACK TO GOOGLE SHEET

var sh1=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“MONITOR”);

sh1.getRange(1, 1).setValue(d);
}

结果:

{Role=PENDING,SyncState=SHARD SYNCING,Alert=true,CommitteeChain=2,NextEventMsg=12 成为 COMMITEE,Status=ONLINE}

现在,如果我尝试同样的操作,并将最后一行切换为:

sh1.getRange(1, 1).setValue(d.Role);
sh1.getRange(1, 2).setValue(d.SyncState);
sh1.getRange(1, 3).setValue(d.Alert);
sh1.getRange(1, 4).setValue(d.CommitteeChain);
sh1.getRange(1, 5).setValue(d.NextEventMsg);
sh1.getRange(1, 6).setValue(d.Status);

它完成了它的执行,但 returns 什么也没有。有什么想法吗?

我测试了您的示例数据,它按预期返回到单独的单元格。但是你能试试这个方法吗?

代码:

Object.keys(d).forEach(function (key, index){
  sh1.getRange(1, index + 1).setValue(d[key]);
});

行为:

  • 迭代 object d 的所有键并放置在第一行(每个单元格 1 个值,类似于每个单元格中的个人 setValue 所做的)

输出:

编辑:

  • d 值似乎在数组中。试试这个:
d.forEach(function (data, row){
  Logger.log(data);
  Object.keys(data).forEach(function (key, index){
    Logger.log(key)
    sh.getRange(row + 1, index + 1).setValue(data[key]);
  });
});

注:

  • 由于我无法测试 fetch 方法的实际响应,为了模拟您的数据,我使用了:

    var d = {Role:"PENDING", SyncState:"SHARD SYNCING", Alert:true, CommitteeChain:2, NextEventMsg:"12 to be COMMITEE", Status:"ONLINE"};

  • 如果您的 d 的值为:

    ,则上述代码应该有效

    {Role=PENDING, SyncState=SHARD SYNCING, Alert=true, CommitteeChain=2, NextEventMsg=12 to be COMMITEE, Status=ONLINE}

编辑 2:

  • 由于您的响应在一个数组中,您需要像 d[0]
  • 一样访问它
  • 下面提供的代码还将添加一个 header,并将循环所有结果(如果返回了多个数据)

代码:

// header
sh.getRange(1, 1, 1, Object.keys(d[0]).length).setValues([Object.keys(d[0])]);
// contents
d.forEach(function (data, row){
  Object.keys(data).forEach(function (key, index){
    sh.getRange(row + 2, index + 1).setValue(data[key]);
  });
});

输出: