Javascript 从另一个对象与另一个数组匹配的数组中检索对象

Javascript 从另一个对象与另一个数组匹配的数组中检索对象,javascript,arrays,json,google-apps-script,google-sheets,Javascript,Arrays,Json,Google Apps Script,Google Sheets,请注意:重复:涉及不同的需求 我正在为Scripto资产开发基于Google Sheets的投资组合。摘要页面提供任何交易所中所有资产的余额 第一个功能连接到第一个exchange帐户(如Bitstamp),下载钱包中所有资产名称的最新列表,并将其记录在第一列,以及exchange列下的相应余额 然后,第二个函数从第二个exchange的帐户(比如binance)检索资产的金额,并将其写入相应的列中。当然,这次脚本需要将金额与第一个脚本中已写入的资产名称相匹配 这里没有固定的单元格 换句话说,第

请注意:重复:涉及不同的需求

我正在为Scripto资产开发基于Google Sheets的投资组合。摘要页面提供任何交易所中所有资产的余额

第一个功能连接到第一个exchange帐户(如Bitstamp),下载钱包中所有资产名称的最新列表,并将其记录在第一列,以及exchange列下的相应余额

然后,第二个函数从第二个exchange的帐户(比如binance)检索资产的金额,并将其写入相应的列中。当然,这次脚本需要将金额与第一个脚本中已写入的资产名称相匹配

这里没有固定的单元格

换句话说,第二个脚本需要了解在哪一行中设置了BTC,例如,在第一列中设置了BTC,并且需要在相应编码行的binance列中写入相应的BTC量

如果我们使用sql,您可以编写如下内容

在binance列中设置来自binance的btc_金额,其中btc_资产===celli+2,1.getValue 不幸的是,这太容易了,所以我想我们做不到

现在,你有什么建议?数组的比较?数组的数组的数组?数组的映射?阵列的过滤器?这个

到目前为止,我一直在尝试:没有任何东西能100%起作用。有些东西根本不起作用

... var data=UrlFetchApp.fetchurl,参数; var data=JSON.parsedata.getContentText; var数据=数据余额; //binance api还返回零平衡的资产,因此我们需要进行筛选 变量数据=data.filterfunction el{ 返回el.free>0; }; var i; 对于i=0;i0; }; var i; 对于i=0;i 基于数据的示例代码段:

function myFunction() {
...
  var oldAsset=sheet.getRange(2, 1, 16).getValues(); //Is the range fix or dynamic?
  var rows=[];
  for (j=0; j < oldAsset.length; j++) {
    rows.push(oldAsset[j][0]);
  }
  var data=...//here comes your data processing part
  for (i=0; i < data.length; i++) {
    var newAsset=data[i].asset;
    var free  = data[i].free;  // process as necessary
    var row=rows.indexOf(newAsset)+2; //THIS THE CRUCIAL PART TO FIND THE CORRECT ROW
     if (row>0){
       sheet.getRange(row, 8).setValue(free);
    }   
  }
}
我没有在这个代码段中实现像这样的处理步骤 toLowerCase、parseFloat等,因为我不知道您的 数据看起来像


关于如何将数据条目分配到正确的行中,您的问题是A列中的条目等于data[i].free吗?确切地说,是A列中的条目等于data[i].asset,它只对应于一个数据[i]。从同一个json对象中释放。谢谢谢谢谢谢!!为什么我没有想到:找到位置..我会立即尝试并尽快给你回复,谢谢你,它很有效!!唯一的一件事:我猜你的意思是var row=rows.indexOfnewAsset+2;。非常感谢,我自己无法制作它。我会预留一些时间来研究它并以防万一,如果你愿意,请询问进一步的解释。谢谢,indexOfnewAsset!很高兴它对你有所帮助!我现在想到的将数据转换为JSON对象的最简单方法可能是正则表达式。例如data=data.replace/=/g,:;以及类似于插入引号的东西。谢谢,但我完全切换到了coinmarketcap api,而不是coingecko:它提供了一个更为常见的数组结构,因此目前不再需要与json共存。谢谢
 {balances=[{asset=BTC, free=0.00966600, locked=0.00000000}, {asset=LTC, free=0.00000000, locked=0.00000000}, {asset=ETH, free=0.00001251, locked=0.00000000}, {asset=NEO, free=0.00000000, locked=0.00000000}, {asset=BNB, free=0.07496873, locked=0.00000000}, {asset=QTUM, free=0.00000000, locked=0.00000000}, {asset=EOS, free=0.00000000, locked=0.00000000}, {asset=SNT, free=0.00000000, locked=0.00000000}, {asset=BNT, free=0.00000000, locked=0.00000000}, {asset=GAS, free=0.00000000, locked=0.00000000}, ...
var data = JSON.parse(data.getContentText());

var keys    = Object.keys(data);
var values  = Object.keys(data).map(function(e){return data[e]});

var result = [];
var k;
for (k=0; k<keys.length; k++){
  if (keys[k].slice(4, 13) == "available") {result.push([keys[k], values[k]]);}}

    var i;
  for (i=0; i<result.length; i++) {

  var key     = result[i][0].slice(0,3);
  var key     = key.toUpperCase();


  var row     = rows.indexOf(key)+2;
  var value   = result[i][1];

     if (row>=2){
       sheet.getRange(row, 5).setValue(value);

     }  
  }
function myFunction() {
...
  var oldAsset=sheet.getRange(2, 1, 16).getValues(); //Is the range fix or dynamic?
  var rows=[];
  for (j=0; j < oldAsset.length; j++) {
    rows.push(oldAsset[j][0]);
  }
  var data=...//here comes your data processing part
  for (i=0; i < data.length; i++) {
    var newAsset=data[i].asset;
    var free  = data[i].free;  // process as necessary
    var row=rows.indexOf(newAsset)+2; //THIS THE CRUCIAL PART TO FIND THE CORRECT ROW
     if (row>0){
       sheet.getRange(row, 8).setValue(free);
    }   
  }
}