【问题标题】:Cannot Set Value of JSON Data to Separate Cells无法将 JSON 数据的值设置为分隔单元格
【发布时间】:2021-05-26 14:07:36
【问题描述】:

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

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

它完成了它的执行但什么也不返回。有什么想法吗?

【问题讨论】:

  • 进行一些调试,例如:Logger.log(d.Role) 以检查您的结果

标签: google-apps-script google-sheets setvalue


【解决方案1】:

我测试了您的样本数据并按预期返回到单独的单元格。但是你可以试试这个方法吗?

代码:

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

行为:

  • 迭代对象 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
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]);
  });
});

输出:

【讨论】:

  • 返回的结果与我在上面为我发布的结果相同。但是,这是一种更清洁的方法。我得到数据爆发的唯一方法是,如果我使用你发布的内容,但更改“var d=response.getContentText();”然而,这只是按字符分解。如果我创建一个新的工作表来分享会更容易吗?
  • 嗨@JohnJackowiak,由于我无法测试 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},那么上面的代码应该可以工作。
  • 嗨@NaziA。我测试了你的方式,事实上,它确实执行正确。不过,我想我已经找到了问题所在。当我使用您的 JSON 数据在引号中的版本时,它运行良好。如果 JSON 没有引号,则没有。由于我的原始 JSON 没有它们,我相信这是问题的根源。但是,我不知道解决这个问题的方法。
  • 它只显示引号,但在记录数据时应该完全一样。我确实相信您正在处理的实际数据存在问题,因此除非我也可以使用该数据,否则我现在无能为力。您可以将response.getContentText(); 值粘贴到您的帖子中吗?也许这样我可以模拟你的数据。
  • 我将复制我正在使用的谷歌表格并仅发布必要的数据,以便您了解发生了什么
猜你喜欢
  • 2015-09-14
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2018-08-13
相关资源
最近更新 更多