Goal我想连接一个应用程序接口(连接到一个叫做Sharesight的网络服务,它监控股票投资组合),这样我就可以把我的投资组合回报每小时(在工作日)拉到谷歌工作表中。然后我会使用Google Sheets每小时给我发一封电子邮件。
确切的过程不一定是这样的,但本质上我想从帐户中提取一些数据并通过电子邮件发送给我。我计划使用Google Sheets,因为我想从JSON中选择特定的东西,所以我认为这是设置公式等的一种简单方法。
警告:我知道是什么,但是我以前从来没有用过,所以我一直在学习。
What I‘s tried...in Google Sheets我尝试使用Google Sheets编写一些代码(我认为是Javascript)来连接到Sharesight (使用所有客户端ID、客户端机密、授权令牌URI、访问令牌URI等)。我认为我失败的地方是我需要指定一个'Redirect URI‘,它在Sharesight注释中说,对于本地测试,我可以使用"urn:ietf:wg:oauth:2.0:oob“。我试过了,但我想我不能这样做,因为我不是在做本地测试。
-所以我的第一个绊脚石is...how我能得到一个重定向URI连接到我的谷歌工作表吗?
然后,我尝试了Postman我只是在谷歌上搜索了这个工具,所以我想我应该试一试,因为我实际上还没有连接到API。因此,幸运的是,我打通了,它连接得很好。我对我的文件夹URL使用了GET的东西,并且我必须传递昨天的日期和今天的日期作为报告的参数-这很好用!
但是我想,我需要把这个导入到Google Sheets中。这真的是可能的吗?在postman中,我正在使用他们的重定向URI,这就是为什么我认为我能够进一步发展(https://www.getpostman.com/oauth2/callback) --然而我需要额外的步骤来推动它通过。
但随后出现了一些其他问题:
对下一步我应该尝试什么有什么建议吗?或者这几乎是不可能的?
发布于 2018-09-28 14:45:43
感谢@Rich (参见其他答案/评论),他为我指明了正确的方向。这正是我最终使用的代码,它为我提供了来自Sharesight的JSON结果。
我(愚蠢地)没有意识到我应该首先将我的客户端ID和客户端秘密传递给访问令牌URL以获取访问令牌,然后再将其作为标头传递给我想要运行的实际报告API。
下一步是研究如何在Google Sheets中将JSON字段转换为电子表格格式!
function getReport()
{
var client_id = 'XXX'
var client_secret = 'YYY'
var url = 'https://edge-api.sharesight.com/oauth2/token?'
+ '&grant_type=client_credentials'
+ '&client_id=' + client_id
+ '&client_secret=' + client_secret
var token = UrlFetchApp.fetch(url,{method:'POST',muteHttpExceptions: true});
var token_data = JSON.parse(token.getContentText());
var access_token = token_data.access_token
var url2 = 'https://edge-api.sharesight.com/api/v2/portfolios/343835/performance.json?'
var report = UrlFetchApp.fetch(url2,{method:'GET',headers:{Authorization: 'Bearer ' + access_token}});
Logger.log(report)
SpreadsheetApp.getActiveSheet().getRange('A1').setValue(report);
}
发布于 2018-09-26 07:55:25
“code”授权类型只适用于基于浏览器的应用程序。
你应该能够做一个不需要重定向的“password”授权类型:
var url = 'https://portfolio.sharesight.com/oauth2/token?grant_type=password&client_id='
+ clientId
+ '&username=' + username + '&password=' + password;
var response = UrlFetchApp.fetch(url, { method: 'POST', muteHttpExceptions: true} );
Logger.log("authorize response: " + response.getResponseCode()
+ "; " + response.getContentText());
var responseMsg = JSON.parse(response.getContentText());
然后应填充responseMsg.access_token
和responseMsg.refresh_token
。您可以使用它们在Sharesight中进行任何API调用,例如,从电子表格中的用户定义函数进行调用。
显然,您需要将凭据放入脚本中--我在Google Sheets中的一个对话框中做到了这一点。
或者(我还没有在Google Sheets中测试过这一点)你可以做一个'client_credentials‘授权--为此,你需要首先联系Sharesight支持,并将你的客户id与你的用户关联,然后你就可以只使用客户id和密钥进行连接了。
发布于 2019-02-25 17:53:44
你已经有了答案,但我想我会分享这篇文章,以防它对其他人有所帮助。此代码获取一个令牌,并将其存储30分钟,以避免在不需要的情况下重新请求令牌。免责声明--我的编程技巧相当基础。
我将这段代码和其余代码放在一起解析JSON,并将其输入到我的站点上的Google sheets中:https://www.callofthesky.com/import-data-from-sharesight-to-google-sheets/
首先定义我们的变量
var ClientID = "CLIENT_ID_GOES_HERE";
var ClientSecret = "CLIENT_SECRET_GOES_HERE";
var PortfolioNumber = "PORTFOLIO_NUMBER_GOES_HERE"
下一个函数返回令牌。如果属性服务中有一个不到30分钟的版本,它将返回它,否则它将从Sharesight获取一个新的版本。
function gettoken() {
var authdetails = {
"grant_type" : "client_credentials",
"client_id" : ClientID,
"client_secret" : ClientSecret
};
var options = {
'method' : 'post',
'payload' : authdetails
};
var scriptProperties = PropertiesService.getScriptProperties();
var issuetime = scriptProperties.getProperty('issuedtime');
if (issuetime !== null) {
var TokenExpiry = (Number(issuetime) + 1800); }
else {
var TokenExpiry = 0;
}
var d = new Date();
var timeStamp = d.getTime();
if (timeStamp > TokenExpiry) {
var response = UrlFetchApp.fetch("https://api.sharesight.com/oauth2/token" , options);
var data = JSON.parse(response.getContentText());
var token = data.access_token;
addtoproperties(token)
}
else {
var token = scriptProperties.getProperty('SStoken');
}
return token
}
以下函数由gettoken()调用。它将接收到的令牌和当前时间添加到属性服务
function addtoproperties(SStoken) {
var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('SStoken', SStoken);
var d = new Date();
var timeStamp = d.getTime();
scriptProperties.setProperty('issuedtime', timeStamp);
var store = scriptProperties.getProperties();
return;
}
https://stackoverflow.com/questions/52498896
复制相似问题