将 Python 请求转换为 Apps 脚本请求
Translate Python request to an Apps Script request
我正在尝试使用 Apps 脚本将 API 请求自动化到 Google 电子表格中,GET 请求似乎在 python 中运行良好,但是当我尝试复制使用 UrlFetchApp.fetch
方法的相同请求会抛出 422 错误,显然忽略了 headers。
这是有效的 python 代码:
url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
r = requests.get(url = caixa, params= {'data_inicio' : '2018-01-01',
'data_fim' : '2022-02-01',
'regime':'caixa'})
但是当我尝试将它复制到 Apps 脚本时,它似乎忽略了那些参数
var link = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token=my_access_token";
headers = {
'data_inicio': '2020-01-01',
'data_fim': '2020-06-30',
'regime': 'caixa',
};
var options = {
"method" : "get",
"contentType":"application/json",
'headers': headers,
};
Logger.log(options);
var res = UrlFetchApp.fetch(link, options)
它抛出以下错误消息:
Exception: Request failed for https://api.granatum.com.br returned code 422. Truncated server response: {"errors":{"data_inicio":["é obrigatório"],"data_fim":["é obrigatório"],"regime":["é obrigatório","inválido"]}} (use muteHttpExceptions option to examine full response)
翻译响应时,它要求提供上面通知的那三个参数,就好像它没有收到它们一样。
我相信你的目标如下。
您想将以下 python 脚本转换为 Google Apps 脚本。
url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
r = requests.get(url = caixa, params= {'data_inicio' : '2018-01-01', 'data_fim' : '2022-02-01', 'regime':'caixa'})
- 在此脚本中,
url
为 "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
。但是 requests
使用 url = caixa
。但是,根据您的 Google Apps 脚本,在此答案中,它假定您使用的是 url
.
当你想在上面的脚本中使用url
,下面的修改怎么样?
修改点:
- 当我看到您的 python 脚本时,似乎
params
的值作为查询参数发送。但是在您的脚本中,这些值是在请求中发送的 header.
- 并且,对于 GET 方法,不需要使用内容类型。
以上几点反映到Google Apps Script后,就变成了下面的样子。
修改后的脚本:
function myFunction() {
// This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
String.prototype.addQuery = function(obj) {
return this + Object.keys(obj).reduce(function(p, e, i) {
return p + (i == 0 ? "?" : "&") +
(Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
},"") : e + "=" + encodeURIComponent(obj[e]));
},"");
}
var url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa";
var query = {
'data_inicio': '2020-01-01',
'data_fim': '2020-06-30',
'regime': 'caixa',
'access_token': 'my_access_token'
};
var res = UrlFetchApp.fetch(url.addQuery(query));
Logger.log(res.getContentText());
}
注:
- 在这个答案中,它假定您的 python 脚本可以与
url
一起正常工作。并且,它假定可以使用您的访问令牌。请注意这一点。
参考:
我正在尝试使用 Apps 脚本将 API 请求自动化到 Google 电子表格中,GET 请求似乎在 python 中运行良好,但是当我尝试复制使用 UrlFetchApp.fetch
方法的相同请求会抛出 422 错误,显然忽略了 headers。
这是有效的 python 代码:
url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
r = requests.get(url = caixa, params= {'data_inicio' : '2018-01-01',
'data_fim' : '2022-02-01',
'regime':'caixa'})
但是当我尝试将它复制到 Apps 脚本时,它似乎忽略了那些参数
var link = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token=my_access_token";
headers = {
'data_inicio': '2020-01-01',
'data_fim': '2020-06-30',
'regime': 'caixa',
};
var options = {
"method" : "get",
"contentType":"application/json",
'headers': headers,
};
Logger.log(options);
var res = UrlFetchApp.fetch(link, options)
它抛出以下错误消息:
Exception: Request failed for https://api.granatum.com.br returned code 422. Truncated server response: {"errors":{"data_inicio":["é obrigatório"],"data_fim":["é obrigatório"],"regime":["é obrigatório","inválido"]}} (use muteHttpExceptions option to examine full response)
翻译响应时,它要求提供上面通知的那三个参数,就好像它没有收到它们一样。
我相信你的目标如下。
您想将以下 python 脚本转换为 Google Apps 脚本。
url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token) r = requests.get(url = caixa, params= {'data_inicio' : '2018-01-01', 'data_fim' : '2022-02-01', 'regime':'caixa'})
- 在此脚本中,
url
为"https://api.granatum.com.br/v1/relatorios/fluxo_caixa?access_token={}".format(token)
。但是requests
使用url = caixa
。但是,根据您的 Google Apps 脚本,在此答案中,它假定您使用的是url
.
- 在此脚本中,
当你想在上面的脚本中使用url
,下面的修改怎么样?
修改点:
- 当我看到您的 python 脚本时,似乎
params
的值作为查询参数发送。但是在您的脚本中,这些值是在请求中发送的 header. - 并且,对于 GET 方法,不需要使用内容类型。
以上几点反映到Google Apps Script后,就变成了下面的样子。
修改后的脚本:
function myFunction() {
// This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
String.prototype.addQuery = function(obj) {
return this + Object.keys(obj).reduce(function(p, e, i) {
return p + (i == 0 ? "?" : "&") +
(Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
},"") : e + "=" + encodeURIComponent(obj[e]));
},"");
}
var url = "https://api.granatum.com.br/v1/relatorios/fluxo_caixa";
var query = {
'data_inicio': '2020-01-01',
'data_fim': '2020-06-30',
'regime': 'caixa',
'access_token': 'my_access_token'
};
var res = UrlFetchApp.fetch(url.addQuery(query));
Logger.log(res.getContentText());
}
注:
- 在这个答案中,它假定您的 python 脚本可以与
url
一起正常工作。并且,它假定可以使用您的访问令牌。请注意这一点。