冗長な記憶の断片

Web技術のメモをほぼ毎日更新(準備中)

Feb 23, 2021 - コメント - 日記

GoogleSpreadSheetにJSONファイルを読み込む

GoogleSpreadSheetにCSVファイルを読み込むスクリプト に続いて、今日はネット上に公開されているJSONファイルをGoogleSpreadSheetに取り込んでみます。

例として適切かわかりませんが、CounterpartyのPoB(Proof of Burn)アドレスを持ってきました

curl https://blockstream.info/api/address/1CounterpartyXXXXXXXXXXXXXXXUWLpVr |jq .

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "address": "1CounterpartyXXXXXXXXXXXXXXXUWLpVr",
  "chain_stats": {
    "funded_txo_count": 2810,
    "funded_txo_sum": 213093143201,
    "spent_txo_count": 0,
    "spent_txo_sum": 0,
    "tx_count": 2809
  },
  "mempool_stats": {
    "funded_txo_count": 0,
    "funded_txo_sum": 0,
    "spent_txo_count": 0,
    "spent_txo_sum": 0,
    "tx_count": 0
  }
}

JSONは階層構造になっているため、以下のようなJSON.flatten関数でドット連結形式に変換します。

JSON flatten

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
JSON.flatten = function(data) {
    var result = {};
    function recurse (cur, prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0, l=cur.length; i<l; i++)
                 recurse(cur[i], prop ? prop+"."+i : ""+i);
            if (l == 0)
                result[prop] = [];
        } else {
            var isEmpty = true;
            for (var p in cur) {
                isEmpty = false;
                recurse(cur[p], prop ? prop+"."+p : p);
            }
            if (isEmpty)
                result[prop] = {};
        }
    }
    recurse(data, "");
    return result;
}

できあがったスクリプトは以下の通りです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function updateTab(data){
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  sheet.clear();
  var i = 1;
  Object.keys(data).forEach(key => { sheet.getRange(i++,1,1,2).setValues([[key, data[key]]]); });
}

function _test_updateTab(){
  var url = "https://blockstream.info/api/address/1CounterpartyXXXXXXXXXXXXXXXUWLpVr";
  var response = UrlFetchApp.fetch(url);
  var data = JSON.flatten(JSON.parse(response.getContentText()));
  updateTab(data);
}

実行結果は以下のようになります。