首页 > 解决方案 > 来自谷歌表格的 API 调用太长

问题描述

我正在尝试在谷歌表格中编写一个脚本来更新我的 3commas 机器人。即使只有 1 项需要更新,API 也需要传递许多必填字段。

我的代码如下,它使用已经从平台读取的值,仅更新 base_order_volume 值。这非常有效,除非当对值很长(超过 2k 个字符)然后我从 UrlFetchApp 调用中收到错误,因为 URL 太长。

var sheet = SpreadsheetApp.getActiveSheet();

var key = sheet.getRange('F4').getValue();
var secret = sheet.getRange('F5').getValue();

var baseUrl = "https://3commas.io"; 
var editBots = "/ver1/bots/"+bots[botCounter].id+"/update";
var patchEndPoint = "/public/api"+editBots+"?";

.
.
[loop around values in sheet]
.
.

var BaseOrder=Number(sheet.getRange(rowCounter,12).getValue().toFixed(2));

var botParams = {
            "name": bots[botCounter].name,
            "pairs": bots[botCounter].pairs,
            "max_active_deals": bots[botCounter].max_active_deals,
            "base_order_volume": BaseOrder,
            "take_profit": Number(bots[botCounter].take_profit),
            "safety_order_volume": bots[botCounter].safety_order_volume,
            "martingale_volume_coefficient": bots[botCounter].martingale_volume_coefficient,
            "martingale_step_coefficient": Number(bots[botCounter].martingale_step_coefficient),
            "max_safety_orders": bots[botCounter].max_safety_orders,
            "active_safety_orders_count": Number(bots[botCounter].active_safety_orders_count),
            "safety_order_step_percentage": Number(bots[botCounter].safety_order_step_percentage),
            "take_profit_type": bots[botCounter].take_profit_type,
            "strategy_list": bots[botCounter].strategy_list,
            "bot_id": bots[botCounter].id
          };

var keys = Object.keys(botParams); 
var totalParams = keys.reduce(function(q, e, i) {
            q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); 
            return q;
          },endPoint);

var signature = Utilities.computeHmacSha256Signature(totalParams, secret);

signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");

var headers = { 
            'APIKEY': key,
            'Signature': signature,
          };

try {
            var params = { 
              'method': 'PATCH',
              'headers': headers,
              'muteHttpExceptions': true
            };

var response = JSON.parse(UrlFetchApp.fetch(baseUrl + totalParams, params).getContentText());

我试图将 botParams 设置为参数中的有效负载,但是当我这样做时签名不正确。

我任何人都知道如何使用工作表使用大量参数进行呼叫,我将不胜感激任何帮助

bots 数组的一些示例数据将是

{
"name": "TestBot",
"base_order_volume": 0.001,
"take_profit": 1.5,
"safety_order_volume": 0.001,
"martingale_volume_coefficient": 2,
"martingale_step_coefficient": 1,
"max_safety_orders": 1,
"active_safety_orders_count": 1,
"safety_order_step_percentage": 2.5,
"take_profit_type": "total",
"stop_loss_percentage": 0,
"cooldown": 0,
"pairs": ["BTC_ADA","BTC_TRX"],
"trailing_enabled":"true",
"trailing_deviation":0.5,
"strategy_list": [{"strategy":"cqs_telegram"}]
}

提前致谢

标签: apigoogle-sheets

解决方案


我会考虑使用云函数来完成繁重的工作,或者,如果您担心成本,请将其用作代理。然后,您可以从 Google 表格调用云功能。Cloud Functions 可以用您最熟悉的任何语言编写,包括 Node.js。

查看GCP 定价计算器以了解费用是多少。在许多情况下,它是完全免费的。

这应该让您了解如何使用云函数创建 CSV:

https://codelabs.developers.google.com/codelabs/cloud-function2sheet#0

是一个带有答案的 SO 问题,解释了如何使用身份验证查询云功能。


推荐阅读