使用 Google Sheets 从 CoinGecko 自动收集历史数据

Automate historic data collection from CoinGecko with Google Sheets

一直在使用 Google 表格从 CoinGecko API 收集历史比特币数据。我必须打开 sheet 并复制和“仅粘贴值”以将数据粘贴到历史列表中的手动方法。左边是历史,右边是数据收集。 如果可能的话,我想自动化这个过程。当前代码提取了 10 行尚未包含在历史记录中的数据。历史记录行以“BOTTOM”字段结尾,表示页面底部。脚本编辑器已设置为 运行 在午夜收集数据。 这是我的例子: https://docs.google.com/spreadsheets/d/1kAcVtF2x9ox7gNCt5liQdhApQpGaBw1kl4I8PjKMfx8/edit?usp=sharing

回答

你必须利用 Sheet范围 类.

代码

为了自动执行该过程,请将以下代码添加到您现有的 Apps 脚本中:

function Pull_History_bitcoin() {

  //PREVIOUS CODE

  var days = parseInt(targetSheet.getRange("J4").getValue().toString());

  if (days > 0) {
    var range = targetSheet.getRange("G6:J" + (5+days)).getValues();
    var lastRowHistory = targetSheet.getRange("G1").getValue();
    var nextLastRowHistory = parseInt(lastRowHistory[1]) + days;

    var bottomCell = targetSheet.getRange("A" + nextLastRowHistory);
    bottomCell.setValue("BOTTOM");

    var nextRange = targetSheet.getRange(`${lastRowHistory}:D` + (nextLastRowHistory - 1));
    nextRange.setValues(range);
  }
}

其中天数定义调用外部 API 后的条目数。

不要担心四舍五入的值,因为它们只是显示四舍五入,当前值与原始值一样。

参考

Sheet class

Range Class

下面是我的完整 google-apps-script,供任何希望从免费的 CoinGecko Api 服务获取加密货币历史信息的人参考。

function Pull_History_bitcoin() {
  var targetSS = SpreadsheetApp.getActive();
  var targetSheet = targetSS.getSheetByName("bitcoin");

  // To force an update
  targetSheet.insertRowBefore(3);
  targetSheet.deleteRow(3);

  // Copy newly acquired history into the history columns
  var days = parseInt(targetSheet.getRange("J4").getValue().toString());

  if (days > 0) {
    var range = targetSheet.getRange("G6:J" + (5+days)).getValues();
    var lastRowHistory = targetSheet.getRange("G1").getValue();
    //var nextLastRowHistory = parseInt(lastRowHistory[1],4) + days;
    var nextLastRowHistoryStr = lastRowHistory.slice(1);
    var nextLastRowHistory = Number(nextLastRowHistoryStr) + days;

    var nextRange = targetSheet.getRange(`${lastRowHistory}:D` + (nextLastRowHistory - 1));
    nextRange.setValues(range);

    var bottomCell = targetSheet.getRange("A" + nextLastRowHistory);
    bottomCell.setValue("BOTTOM");
  }
}