我在谷歌Apps脚本,当我在谷歌Apps脚本运行它工作得很好创建功能。输出数据返回到谷歌表。
function testFunction11() {
var rng = SpreadsheetApp.getActiveRange();
var encodedAuthInformation = Utilities.base64Encode("username:key");
var headers = {"Authorization" : "Basic " + encodedAuthInformation};
var params = {
'method': 'GET',
'muteHttpExceptions': true,
'headers': headers
};
var res = UrlFetchApp.fetch("https://api.apiservice.com/api/v1/xxx?fields=somefields", params);
Logger.log(res.getContentText());
rng.setValue(res);
}
输出单元:
[
{
"id": xxx,
"createdDate": "2019-02-01T04:54:00Z",
"reference": "XXX"
},
etc
然后我给你的脚本按钮,“testFunction11”。当我点击按钮,返回
{
"message": "An error has occurred."
}
它看起来像从API服务器响应。
我唯一的假设是,谷歌片的按钮增加了一些头,用户代理或内容类型的要求,这在API服务器不允许的。而一些搜索后,我想我不能要求重新分配的User-Agent。那是正确的事情还是我错了?
编辑1:
每个案例console.log(UrlFetchApp.getRequest(url, params))
头:在电子表格中点击按钮:
{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=, X-Forwarded-For=178.xx.my.ip}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}
而对于脚本:
{headers={Authorization=Basic XXXXXXXXQVU6MWVhODlmZmFkN2U3NGNjOGJkOTc1YTE1ZjVhNTE3MzE=}, method=get, payload=, followRedirects=true, validateHttpsCertificates=true, useIntranet=false, contentType=null, url=https://api.apisite.com/api/v1/SalesOrders?fields=Id,Createddate,Reference&where=Createddate%3E2019-02-01T00:00:00Z}
所以按钮只会增加X-Forwarded-For
。
当我试图手动添加X-Forwarded-For: 'unknown'
有这样的错误
There are attribute with impossible value: Header:X-Forwarded-For
在俄罗斯的错误的文字,对可能不准确的翻译很抱歉。这很有趣,因为当我在同样的方式加入Test: unknown
,没有错误,但显然没有工作。看起来谷歌不允许更改此值。
将尝试在邮递员不同的页眉和可能确认这头是错误的原因。谢谢@TheMaster
编辑2:
我通过邮差尝试了不同的标题。所以,结果是,当我加入到X-Forwarded-For
键与任何价值,它返回"message": "An error has occurred."
当我不添加此键头,效果很好。
所以,问题是任何方法来禁用添加通过谷歌Apps脚本这个头。好像没有。
UrlFetchApp.fetch()
从电子表格上的按钮运行,X-Forwarded-For
被自动添加到头部。X-Forwarded-For
到头部时,发生An error has occurred.
的错误。X-Forwarded-For
未在报头中使用,不会发生错误。如果我的理解是正确的,这个怎么样的解决方法?我想可能有几种解决方法。所以,请认为这是他们的只有一个。在此解决方案,Web应用程序被用作包装函数。
首先,请复制并粘贴下面的脚本。并请设置testFunction11()
到按钮。当运行testFunction11()
,testFunction11()
请求Web应用程序(doGet()
)和Web应用程序请求https://api.apiservice.com/api/v1/xxx?fields=somefields
。由此,X-Forwarded-For
不是用来请求的报头中。然后,Web应用程序的结果返回,并把价值的电子表格。请部署Web应用程序,在运行脚本之前。
function testFunction11() {
var rng = SpreadsheetApp.getActiveRange();
var url = ScriptApp.getService().getUrl();
var params = {method: "get", headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
var res = UrlFetchApp.fetch(url, params);
Logger.log(res.getContentText());
rng.setValue(res);
}
function doGet() {
var url = "https://api.apiservice.com/api/v1/xxx?fields=somefields";
var encodedAuthInformation = Utilities.base64Encode("username:key");
var headers = {"Authorization" : "Basic " + encodedAuthInformation};
var params = {
'method': 'GET',
'muteHttpExceptions': true,
'headers': headers
};
var res = UrlFetchApp.fetch(url, params);
return ContentService.createTextOutput(res.getContentText());
}
在运行此脚本,请部署Web应用程序。