首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用importData获取和解析JSON

使用importData获取和解析JSON
EN

Stack Overflow用户
提问于 2022-08-19 14:15:05
回答 1查看 55关注 0票数 1

我有以下功能运行得很好:

代码语言:javascript
复制
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var habSheet = ss.getSheetByName("Harvests");
  var bVals = habSheet.getRange("b2:b").getValues();
  var habs = bVals.filter(String).length;
  var habitats = habSheet.getRange("B2:B"+habs+1).getDisplayValues();
  var data = [];
  var traitNames = habSheet.getRange("D1:U1").getValues();
  var values = new Array(habs);
  for (i = 0; i < habs; i++) {
    values[i] = new Array(traitNames[0].length);
    for (j=0; j<traitNames[0].length; j++){
      values[i][j] = [""];
    }
  }
  var rawData = "";
  var names = new Array(habs);
  for (i = 0; i < habs; i++) {
    names[i] = new Array(1);
  }
  for (i=0; i<habs; i++){
    try{
    rawData = UrlFetchApp.fetch("https://api.genopets.me/habitat/"+habitats[i]);
    data[i] = JSON.parse(rawData.getContentText());
    names[i][0] = data[i].name;
    for (j=0; j<data[i].attributes.length; j++){
      value = data[i].attributes[j].value;
      trait = data[i].attributes[j].trait_type;
      for (k=0; k<=21; k++){

        if (traitNames[0][k] == trait){
          values[i][k] = value;
        }
      }
    }
    }
    catch(err){

但我每天都要接电话。我有紧急情况,因为需要在一小时内再次运行。我正在尝试构建一个临时修复程序,因此我使用importData来使用以下公式调用API:

代码语言:javascript
复制
=join(",",IMPORTDATA("https://api.genopets.me/habitat/"&B2,","))

然后,我只想用这些导入的数据替换代码中的rawData。然而,现在它以文本的形式出现,不能以同样的方式进行解析。有没有一种快速的方法强制它成为JSON格式,或者像以前一样转换成字典,这样我就可以用相同的代码来解析它了吗?我被困住了,因为.name、.length等都失败了,因为"rawData“现在只是一个字符串。下面是我正在使用的代码片段,用来尝试正确处理这个问题并构建快速修补程序:

代码语言:javascript
复制
//  for (i=0; i<habs; i++){
    var i=0;
    importData = habSheet.getRange("AL1").getDisplayValue();
    rawData = JSON.stringify(importData);
//    Logger.log(rawData);
    data[i] = rawData;
//    data[i] = JSON.parse(rawData.getContentText());
    names[i][0] = data[i].name;
    for (j=0; j<data[i].attributes.length; j++){
      value = data[i].attributes[j].value;
      trait = data[i].attributes[j].trait_type;
      for (k=0; k<=21; k++){

        if (traitNames[0][k] == trait){
          values[i][k] = value;
        }
      }
    }

我试过像上面一样,也没有紧张,但我还不能得到这个。

作为参考,这是API响应的一个示例:

https://api.genopets.me/habitat/7vTz9dniU14Egpt8XHkMxP1x36BLRd15C11eUTaWhB19

感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2022-08-19 23:25:50

为了找到一个简单的解决方法,我已经做了很多测试,但是找不到一个,由=join(",",IMPORTDATA(url,","))产生的字符串(以及其他的=IMPORTXXX函数)不会对您的代码起作用。在使用这些导入函数时,将解释数据,删除某些字符或格式化值,因此不建议使用这些函数。

由于您提到了您收到的消息与配额限制有关,因此您应该考虑在多个Apps脚本项目中分担此脚本的负载。作为一种可能的即时解决方案,您可以创建脚本的副本(或绑定到脚本的文件),授权新副本,然后再试一次。

要提高性能,可以尝试批量使用调用,使用另一个函数fetchAll (https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchallrequests)。此方法有100个请求限制。这将导致相同的配额使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73418157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档