首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以使用Google Sheets连接到应用程序接口(使用OAuth2)吗?或者我可以从Postman向Google Sheets发送每小时计划的响应吗?

我可以使用Google Sheets连接到应用程序接口(使用OAuth2)吗?或者我可以从Postman向Google Sheets发送每小时计划的响应吗?
EN

Stack Overflow用户
提问于 2018-09-25 21:03:35
回答 3查看 760关注 0票数 2

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) --然而我需要额外的步骤来推动它通过。

但随后出现了一些其他问题:

  • 真的可以每小时运行一次并“做点什么”吗?它是否具有计划功能?
  • 它是否可以在未打开计算机的情况下运行?如果不是,那么它对我来说就没有什么用处了(除非我可以复制代码)
  • 有一种方法可以导出“获取新的访问令牌”的代码,它看起来很好地显示为图形用户界面的东西,但我确信在后端发生了几件事,身份验证URL和访问令牌URL。如果我能使用谷歌工作表,这可能会很方便。

对下一步我应该尝试什么有什么建议吗?或者这几乎是不可能的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-28 14:45:43

感谢@Rich (参见其他答案/评论),他为我指明了正确的方向。这正是我最终使用的代码,它为我提供了来自Sharesight的JSON结果。

我(愚蠢地)没有意识到我应该首先将我的客户端ID和客户端秘密传递给访问令牌URL以获取访问令牌,然后再将其作为标头传递给我想要运行的实际报告API。

下一步是研究如何在Google Sheets中将JSON字段转换为电子表格格式!

代码语言:javascript
运行
复制
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); 
}
票数 2
EN

Stack Overflow用户

发布于 2018-09-26 07:55:25

“code”授权类型只适用于基于浏览器的应用程序。

你应该能够做一个不需要重定向的“password”授权类型:

代码语言:javascript
运行
复制
  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_tokenresponseMsg.refresh_token。您可以使用它们在Sharesight中进行任何API调用,例如,从电子表格中的用户定义函数进行调用。

显然,您需要将凭据放入脚本中--我在Google Sheets中的一个对话框中做到了这一点。

或者(我还没有在Google Sheets中测试过这一点)你可以做一个'client_credentials‘授权--为此,你需要首先联系Sharesight支持,并将你的客户id与你的用户关联,然后你就可以只使用客户id和密钥进行连接了。

(参见https://alexbilbie.com/guide-to-oauth-2-grants/)

票数 2
EN

Stack Overflow用户

发布于 2019-02-25 17:53:44

你已经有了答案,但我想我会分享这篇文章,以防它对其他人有所帮助。此代码获取一个令牌,并将其存储30分钟,以避免在不需要的情况下重新请求令牌。免责声明--我的编程技巧相当基础。

我将这段代码和其余代码放在一起解析JSON,并将其输入到我的站点上的Google sheets中:https://www.callofthesky.com/import-data-from-sharesight-to-google-sheets/

首先定义我们的变量

代码语言:javascript
运行
复制
var ClientID = "CLIENT_ID_GOES_HERE";
var ClientSecret = "CLIENT_SECRET_GOES_HERE";
var PortfolioNumber = "PORTFOLIO_NUMBER_GOES_HERE"

下一个函数返回令牌。如果属性服务中有一个不到30分钟的版本,它将返回它,否则它将从Sharesight获取一个新的版本。

代码语言:javascript
运行
复制
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()调用。它将接收到的令牌和当前时间添加到属性服务

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52498896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档