【小程序】Google Sheets | 管理你的加密貨幣錢包餘額
半吊子業餘程序猿又來老王賣瓜了!!!
上次用Python抓LikeCoin錢包餘額的文章看留言感覺還是有點難度,使用率感覺應該是很低很低……所以這禮拜決定改用Google Sheet!!!
雖然後臺還是有代碼,但是這回不用你複製貼上,直接用我提供的範本就行,你需要做的只有:另存範本、加入你的錢包地址、還有按照下面提供的步驟設定自動跑時間就好。希望這篇文章不會是另一篇“好像很厲害,但是我看不懂”的技術文。
🛑 警告:因爲帶脚本的谷歌Sheets會存在你的谷歌雲端硬盤,所以如果決定使用,還請各位最好能存在沒有個人資料的谷歌賬號,不然就只能自行確認程序碼,或者相信大叔的人品了。
程序碼會貼在文後,以供參考。
🟨 作品介紹
這是一個用Google Sheets做的錢包餘額總匯,可以幫你監視你不同錢包裏的三項餘額(可用、委托、委托收益等),還會按照更新時最新的匯率,提供相對應的美金金額以供參考,當前版本只限已上架Osmosis的幣幣。
第一次使用需要用電腦設定自動跑脚本的時間段,之後便可隨意在手機或電腦上查看。
作品點擊這裏開啓。
🟨 適用人群
- 手機版Kepler錢包沒有支持你所持有的幣(如LikeCoin)
- 委托了好幾種幣,想要經常確認有多少收益可以再拿來委托
- 持有錢包數量 > 1
備注:如果你有好幾種幣,但是只有一個Kepler錢包,也可以考慮用Ping Wallet管理,詳情請看Daisy的文章。
🟨 使用説明:第一次設定
❶ 點擊這裏打開文件,點擊“檔案” >> “建立副本”,開啓複製選項。
❷ 把文件名稱換成自己喜歡的名字,然後選擇文件夾再點擊“確認”。如果嫌麻煩直接點“確定”也是可以。
❸ 開始更新複製的檔案。第一行有三種顔色,請參考下圖説明。需要用戶輸入的只有藍色欄位,畢竟我可不知道你的錢包地址、錢包名和要看的貨幣(笑)。
一行肯定不夠用,要新增只要複製第二行貼到第三行再重複第三步即可。
❹ 資料更新完畢就讓我們來手動啓動脚本測試看看吧。點擊“API”工作簿,點擊“手動刷新”按鈕。
這步是爲了確認巨集可以正常運行。
❺ 第一次跑需要授權該脚本,點擊“繼續”,以後就不用授權了。
❻ 還會有如下圖般的警告!所以再次申明,爲了安全起見,大家用的時候最好用沒有個人資料的谷歌賬號(這樣你就完全不用擔心本人的程式碼暗藏會偷你個人資料的機關)。如果決定使用就先點擊“高級”再點擊“轉至Get_Info(不安全)”。這個也是只有第一次會出現,後面就不需要再確認了。話説如果有人知道怎麽讓谷歌驗證,歡迎留言告知。
❼ 確認後,就會看到開始跑和跑完的提示。
❽ 倒回去工作頁“錢包結餘”看,資料已經更新完畢。巨集更新的時候也會記錄時間,所以一看就知道是什麽時候更新的。這一欄在設定好自動跑後會特別重要,因爲一看就知道它有沒有乖乖工作。
🟨 使用説明:定時自動更新
講了這麽多麻煩的設定,終於要到最棒的地方了!按鈕跑巨集要等它跑完,但是設定讓它定時自動跑,你打開看就不用等了。
❶ 點擊“擴充功能” >> “Apps Script”
❷ 在彈出的視窗點擊鬧鐘圖形的“觸發條件”。
❸ 點擊“新增觸發條件”,開始設定觸發條件。
❹ 按照下圖設定一天更新4次,如果想要跑更多次可以在選項”選取時間型觸發條件類型”和“選取小時間隔”修改。最快可以一分鐘跑一次。
設定完別忘記點擊”儲存“。
❺ 看到如下圖般多了一行觸發條件就是完成了。
🟨 補充説明
雖然號稱可以查看所有COSMOS鏈上有的幣,但是要先加上相對應的API。工作頁“API”目前只記錄了下面這些幣,其他幣可以去Ping Wallet找相對應的API加上,如果嫌麻煩也可以支持本文5港幣,並留言想要加的API(一次最多5種,因爲我怕你叫我全部加到完……)。
🟨 你也許錯過的文章
簡單來説就是為舊文打廣告?
小工具
Excel VBA
Excel小技巧
🟨 程式碼
巨集.gs
function AutoRunInfo() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sht00 = ss.getSheetByName("錢包結餘"); tR0 = sht00.getLastRow() //SpreadsheetApp.getUi().alert('Confirmation received.'); UnitCol = 8 for (var sR0 = 2; sR0 <= tR0; sR0++) { aToken = sht00.getRange(sR0,1).getValue().toLowerCase(); if (sht00.getRange(sR0,1).getValue() !=""){ //質押 aURL = sht00.getRange(sR0,UnitCol+1).getValue(); try{ aValue = GetTokenAvailable(aURL,aToken)/sht00.getRange(sR0,UnitCol+0).getValue(); } catch (e) { aValue = "Error" } sht00.getRange(sR0,3).setValue(aValue); //委托 sURL = sht00.getRange(sR0,UnitCol+3).getValue(); try{ sValue = GetTokenStake(sURL)/sht00.getRange(sR0,UnitCol+0).getValue(); } catch (e) { sValue = "Error" } sht00.getRange(sR0,5).setValue(sValue); //獎勵,沒有委托 = 沒有獎勵,所以要先確認是不是有委托 if(sValue != 0){ rURL = sht00.getRange(sR0,UnitCol+2).getValue(); try{ rValue = GetTokenReward(rURL)/sht00.getRange(sR0,UnitCol+0).getValue(); } catch (e) { rValue = "Error" } } else { rValue = 0 } sht00.getRange(sR0,4).setValue(rValue); totalQty = 0 if (aValue != "Error"){ totalQty = totalQty + aValue; } if (rValue != "Error"){ totalQty = totalQty + rValue; } if (sValue != "Error"){ totalQty = totalQty + sValue; } try{ //totalValue = GetPrice("https://api-osmosis.imperator.co/tokens/v1/"+aToken,"price"); totalValue = totalQty * GetPrice("https://api-osmosis.imperator.co/tokens/v1/"+aToken,"price"); } catch (e) { totalValue = "Error" } sht00.getRange(sR0,6).setValue(totalValue); sht00.getRange(sR0,UnitCol+4).setValue(new Date()); } } };
API.gs
function GetPrice(Url,itemKey) { var res = UrlFetchApp.fetch(Url); var content = res.getContentText(); var jsonObject = JSON.parse(content); return jsonObject[0][itemKey]; } function GetTokenAvailable(Url,token) { var res = UrlFetchApp.fetch(Url); var content = res.getContentText(); var jsonObject = JSON.parse(content); var xyz = Number(jsonObject["pagination"]["total"]) var amt = 0.0 if (xyz == 0 ) { return 0; } else if (xyz == 1) { return Number(jsonObject["balances"][0]["amount"]); } else { for (var i = 0; i < xyz; i++) { denom = String((jsonObject["balances"][i]["denom"])); if (denom.includes(token) == true){ amt+= Number(jsonObject["balances"][i]["amount"]); } } return amt; } } function GetTokenStake(Url) { try { var res = UrlFetchApp.fetch(Url); } catch (e) { return 0; } var content = res.getContentText(); var jsonObject = JSON.parse(content); var xyz = Number(jsonObject["pagination"]["total"]) var amt = 0.0 if (xyz == 0 ) { return 0; } else { for (var i = 0; i < xyz; i++) { amt+= Number(jsonObject["delegation_responses"][i]["delegation"]["shares"]); } } return amt; } function GetTokenReward(Url) { var res = UrlFetchApp.fetch(Url); var content = res.getContentText(); var jsonObject = JSON.parse(content); return Number(jsonObject["total"][0]['amount']); }