JSON数组创建和过滤

时间:2013-08-01 07:05:34

标签: google-apps-script

我正在尝试从API输出创建数组。然后将数组过滤到itemID指定的一个项目。以下是我的尝试。我收到一个错误,即jsonArray在功能测试中不存在。我认为我需要把它变成一个全局变量或其他东西,但这就是我碰壁的地方。

function onOpen() {
var myUrl = "http://www.gw2spidy.com/api/v0.9/json/all-items/all"
var jsonData = UrlFetchApp.fetch(myUrl);
var jsonArray = JSON.Parse(jsonData);
return jsonArray
}

function test(itemID) {
var jsonFilter = jsonArray.filter(function(itemID){return itemID.data_id==itemID});
var jsonObject = JSON.parse(jsonFilter).result;
var adjustedValue = (jsonObject.min_sale_unit_price / 100);
return adjustedValue;
}

我以前使用过以下代码(从其他人那里获取),但是每次使用该函数都会调用它。我正在尝试减少每张表刷新一次调用的调用次数(这是在google docs脚本管理器中)。

// function to return the current sell value for an item (designated by
 // the item’s ID number) from GW2Spidy's API formatted with copper in
 // the tens and hundreds places
function getItemSellValue(itemID) {
 // base URL for the API that will return JSON for the itemID supplied
var myUrl = "http://www.gw2spidy.com/api/v0.9/json/item/" + escape(itemID);
 // fetches the information from the URL in an HTTPResponse
var jsonData = UrlFetchApp.fetch(myUrl);
 // now we convert that response into a string so that we can use it
var jsonString = jsonData.getContentText();
 // now, we turn it into a Javascript object for easier handling
 // *note: I also remove the "result" wrapper object so we can
 // use direct calls on the objects parameters
var jsonObject = JSON.parse(jsonString).result;
 // now I divide the value by 100 in order to format it more like
 // currency. (ie. 126454, which equals 12 gold, 64 silver,
 // and 54 copper will now be displayed as
 // 1264.54)
var adjustedValue = (jsonObject.min_sale_unit_price / 100);
 // finally we return the adjusted min sell value
return adjustedValue;
}

更新 的 我更新了删除onOpen()并切换到缓存服务的代码。我现在收到以下错误:“错误:参数太大:值(第12行,文件”gwspidy api“)”。第12行是cache.put("gw2spidy-data", jsonData, 1500);它只是数据的大小吗?我不知道我能过滤多少钱。完整的代码如下。

function test(itemID) {
  var cache = CacheService.getPublicCache();
  var cached = cache.get("gw2spidy-data");
// check if the data is cached and use it if it is
  if (cached != null) {
    var jsonData = cached
    }
//otherwise fetch the data and cache it
  else {
    var myUrl = "http://www.gw2spidy.com/api/v0.9/json/all-items/all"
    var jsonData = UrlFetchApp.fetch(myUrl);
    cache.put("rss-feed-contents", jsonData, 1500);
    }
//put data into an array and filter the result down to the given id, then return the function value
  var jsonArray = JSON.Parse(jsonData);
  var jsonFilter = jsonArray.filter(function(itemID){return itemID.data_id==itemID});
  var jsonObject = JSON.parse(jsonFilter).result;
  var adjustedValue = (jsonObject.min_sale_unit_price / 100);
  return adjustedValue;  
}

1 个答案:

答案 0 :(得分:2)

看起来你有一些想法越过,导致你出现问题。

  • 对象jsonArray在函数onOpen()的范围内声明,超出了test()的范围。

  • onOpen()触发器功能位于电子表格或文档容器绑定脚本中时,它是一个简单的触发器。从您的问题或代码中不清楚这个脚本是在一个脚本中,还是在一个独立的脚本中。

  • onOpen()函数不需要return任何东西 - 调用它的事件管理器将忽略返回的任何值。这不是在函数范围之外使值可用的机制。

  • 如果你的意图是让onOpen()函数填充一个可供其他函数使用的对象,那么你关于全局的权利是正确的1 ...但您需要使用其他一些机制来共享该值。 (查看Cache Service - 这是完美的。)


1 脚本的每个单独执行都在新的执行实例中完成。因此,在代码块之外定义的任何变量(也称为“全局”变量)对于该实例是唯一的。当事件调用触发器函数时,它在其自己的实例中运行,并且它设置的任何全局值仅对该实例可见;例如,电子表格或文档UI调用的另一个函数将拥有其非范围对象(全局)的非常自己的版本。