【小程序】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']);
}
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!











