鑫大叔
鑫大叔

一個在獲得肺腺癌末期患者頭銜後更加迷茫的大叔

【小程序】Google Sheets | 管理你的加密貨幣錢包餘額

上次用Python抓LikeCoin錢包餘額的文章看留言感覺還是有點難度,使用率感覺應該是很低很低……所以這禮拜決定改用Google Sheet!!!

半吊子業餘程序猿又來老王賣瓜了!!!

上次用Python抓LikeCoin錢包餘額的文章看留言感覺還是有點難度,使用率感覺應該是很低很低……所以這禮拜決定改用Google Sheet!!!

雖然後臺還是有代碼,但是這回不用你複製貼上,直接用我提供的範本就行,你需要做的只有:另存範本、加入你的錢包地址、還有按照下面提供的步驟設定自動跑時間就好。希望這篇文章不會是另一篇“好像很厲害,但是我看不懂”的技術文。

🛑 警告:因爲帶脚本的谷歌Sheets會存在你的谷歌雲端硬盤,所以如果決定使用,還請各位最好能存在沒有個人資料的谷歌賬號,不然就只能自行確認程序碼,或者相信大叔的人品了

程序碼會貼在文後,以供參考。

🟨 作品介紹

這是一個用Google Sheets做的錢包餘額總匯,可以幫你監視你不同錢包裏的三項餘額(可用、委托、委托收益等),還會按照更新時最新的匯率,提供相對應的美金金額以供參考,當前版本只限已上架Osmosis的幣幣。

第一次使用需要用電腦設定自動跑脚本的時間段,之後便可隨意在手機或電腦上查看。

作品點擊這裏開啓。

🟨 適用人群

  • 手機版Kepler錢包沒有支持你所持有的幣(如LikeCoin)
  • 委托了好幾種幣,想要經常確認有多少收益可以再拿來委托
  • 持有錢包數量 > 1

備注:如果你有好幾種幣,但是只有一個Kepler錢包,也可以考慮用Ping Wallet管理,詳情請看Daisy的文章

綠色欄位是小程序會提供的資料


🟨 使用説明:第一次設定

❶ 點擊這裏打開文件,點擊“檔案” >> “建立副本”,開啓複製選項

打開複製選項


❷ 把文件名稱換成自己喜歡的名字,然後選擇文件夾再點擊“確認”。如果嫌麻煩直接點“確定”也是可以。

把範本存到自己的谷歌硬盤,不然無法修改


❸ 開始更新複製的檔案。第一行有三種顔色,請參考下圖説明。需要用戶輸入的只有藍色欄位,畢竟我可不知道你的錢包地址、錢包名和要看的貨幣(笑)。

一行肯定不夠用,要新增只要複製第二行貼到第三行再重複第三步即可。

除了藍色欄位,其他請不要更動,以免小程序失靈
欄位分類説明


❹ 資料更新完畢就讓我們來手動啓動脚本測試看看吧。點擊“API”工作簿,點擊“手動刷新”按鈕。

這步是爲了確認巨集可以正常運行。

點擊手動刷新測試巨集是否可以正常運行


❺ 第一次跑需要授權該脚本,點擊“繼續”,以後就不用授權了。

授權許可


❻ 還會有如下圖般的警告!所以再次申明,爲了安全起見,大家用的時候最好用沒有個人資料的谷歌賬號(這樣你就完全不用擔心本人的程式碼暗藏會偷你個人資料的機關)。如果決定使用就先點擊“高級”再點擊“轉至Get_Info(不安全)”。這個也是只有第一次會出現,後面就不需要再確認了。話説如果有人知道怎麽讓谷歌驗證,歡迎留言告知。

自己寫的巨集被這樣懷疑還真是心情很複雜


❼ 確認後,就會看到開始跑和跑完的提示。

巨集運行過程和完成的提示


❽ 倒回去工作頁“錢包結餘”看,資料已經更新完畢。巨集更新的時候也會記錄時間,所以一看就知道是什麽時候更新的。這一欄在設定好自動跑後會特別重要,因爲一看就知道它有沒有乖乖工作。

巨集更新的時候也會記錄時間,所以一看就知道是什麽時候更新的


🟨 使用説明:定時自動更新

講了這麽多麻煩的設定,終於要到最棒的地方了!按鈕跑巨集要等它跑完,但是設定讓它定時自動跑,你打開看就不用等了。

點擊“擴充功能” >> “Apps Script”

開啓Apps Script可以看到程序碼和設定自動跑的條件


❷ 在彈出的視窗點擊鬧鐘圖形的“觸發條件”。

鬧鐘圖形 = 觸發條件設定


❸ 點擊“新增觸發條件”,開始設定觸發條件。

點擊“新增觸發條件”,開始設定觸發條件


❹ 按照下圖設定一天更新4次,如果想要跑更多次可以在選項”選取時間型觸發條件類型”和“選取小時間隔”修改。最快可以一分鐘跑一次。

設定完別忘記點擊”儲存“。

觸發條件設定,設定完別忘記點擊”儲存“


❺ 看到如下圖般多了一行觸發條件就是完成了。

觸發條件設定完成


🟨 補充説明

雖然號稱可以查看所有COSMOS鏈上有的幣,但是要先加上相對應的API。工作頁“API”目前只記錄了下面這些幣,其他幣可以去Ping Wallet找相對應的API加上,如果嫌麻煩也可以支持本文5港幣,並留言想要加的API(一次最多5種,因爲我怕你叫我全部加到完……)。

現在範本只支持這些幣,因爲大叔只添加了這幾個幣的API……


🟨 你也許錯過的文章

簡單來説就是為舊文打廣告?

小工具

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']);  
}



CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…
加载中…

发布评论