1

我有一个谷歌地图引擎项目,可以通过谷歌表单/谷歌应用脚​​本更新数据源。我知道有一种方法可以在 GAS 中配置 OAuth(https://developers.google.com/apps-script/reference/url-fetch/o-auth-config),但我不知道如何实现在花费数小时阅读 GAS 和 GME 文档后工作。我已经能够使用OAuth Playground获得访问令牌来解决它,但我需要每小时手动刷新一次。我知道答案可能很简单,但我是 OAuth 新手,我找不到简单的指南来帮助我。

如何让我的 Google Apps 脚本通过 OAuth 与 Google Maps Engine 完美配合?

我在下面列出了我目前如何访问 GME:

    /* This function is called when a new provider is added through the "Medical Providers" form
   It sends an HTTP request to Google Maps Engine to add the new provider to the map */
function addNewtoTable(row){
  var aPIKey = "MY_API_KEY";
  var bearer = "ACCESS_TOKEN_FROM_OAUTH_PLAYGROUND";
  var projectID = "MY_PROJECT_ID";
  var tableID = "MY_TABLE_ID";
  //tutorial here https://developers.google.com/maps-engine/documentation/tutorial
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Providers");

  var address = sheet.getRange(row,2).getValue();
  var response = Maps.newGeocoder().geocode(address);
  for (var j = 0; j < response.results.length; j++) {
    var result = response.results[j];
    //Logger.log('%s: %s, %s', result.formatted_address, result.geometry.location.lat,
    //             result.geometry.location.lng);
  };
  var lat = result.geometry.location.lat;
  var long = result.geometry.location.lng;
  var name= '"'+sheet.getRange(row,1).getValue()+'"';
  var phone= '"'+sheet.getRange(row,4).getValue().toString()+'"';
  var email= '"'+sheet.getRange(row,3).getValue()+'"';
  var inbounds= '"'+sheet.getRange(row,5).getValue().toString()+'"';
  var outbounds = '"'+sheet.getRange(row,6).getValue().toString()+'"';
  var lastIn = '" '+sheet.getRange(row,7).getValue().toString()+' "';
  var lastOut = '" '+sheet.getRange(row,8).getValue().toString()+' "';
  var gxid = '"'+sheet.getRange(row,9).getValue().toString()+'"';

  //HTTP request goes here
  var payload = '{features:[{type: "Feature",geometry:{type: "Point",coordinates: ['+long+','+lat+']},properties: {gx_id: '+gxid+',name: '+name+',phone:'+phone+',email:'+email+',inbound:'+inbounds+',outbound:'+outbounds+',last_inbound:'+lastIn+',last_outbound:'+lastOut+'}}]}';
  Logger.log(payload);


  var headers = {"Authorization": "Bearer ACCESS_TOKEN_FROM_OAUTH_PLAYGROUND", "Content-type": "application/json"};
  var options ={"method" : "post","headers" : headers, "payload" : payload, "muteHttpExceptions" : true};
  var httpresponse = UrlFetchApp.fetch("https://www.googleapis.com/mapsengine/v1/tables/MY_TABLE_ID/features/batchInsert",options);
  Logger.log(httpresponse);

  if (httpresponse!=""){
    MailApp.sendEmail('MY_EMAIL', 'HTTP Request Failed to Send', httpresponse);
  };
};
4

2 回答 2

0

这当然是可能的。App Script 文档有一个教程解释了如何使用 OAuth 连接到远程服务,该 OAuth 使用 Twitter API 作为示例。此示例还显示正在执行的 OAuth 授权调用。

Maps Engine 教程的主要区别在于第一步,您无需在 Twitter 上进行设置,而是在Developers Console中进行设置。

除了设置之外,这些指针可能会对您有所帮助。

  • 调用可以使用UrlFetchApp.addOauthService("twitter")任何字符串作为标识符,短语“twitter”没有什么特别之处,但它需要匹配oAuthServiceName
  • 您需要的 URL 看起来应该是这些(从此处获取):
    • oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
    • oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);范围在这里解释。
    • oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
于 2014-08-20T01:01:40.860 回答
0

对我的目的来说有点太晚了,但我发现 Google 自己为 GAS 制作了一个支持 OAuth 2.0 的库。为什么这不包含在 GAS 中,我无法理解。这看起来也很新,截至 5 天前有一些更新。

于 2015-03-09T21:22:38.997 回答