在Google Apps脚本中使用Admin SDK Directory API创建一个组并不起作用"在表单提交"

时间:2014-06-30 12:18:18

标签: google-apps-script oauth-2.0 google-apps google-admin-sdk google-directory-api

我已阅读了管理员ADK Directory API documentation中的所有相关网页以及有关stackoverflow的几个问题,而且我仍然卡住了。

我是Google Apps域的超级管理员,我希望我域中的用户能够创建自己的Google网上论坛。我制作了一个Google表单,用户可以在其中指定该组的名称和电子邮件。然后,Google表单回复表中有一个" On表单提交"触发器调用我的代码来创建组。

当我从脚本编辑器运行createGroupTest()时,此代码有效。它会立即在我的Google应用领域中创建该群组。

当" On表单提交&#34>时,此代码 不起作用trigger运行onFormSubmit(e)函数。我收到了来自catch(e) Exception: Failed to authenticate for service: Groups的电子邮件。

有没有人知道是什么原因导致oauth身份验证在脚本编辑器中工作,但在onFormSubmit函数调用时却没有?

function createGroupTest() {

  var t = new Date();
  t = t.getTime();

  createGroup("AAA Test Group " + t,"aaa.testgroup." + t + "@mydomain.com","me@mydomain.com");

}

var consumerKey="mydomain.com";
var consumerSecret="xxxxxxxxxxxxxxxxxxxxxxxx";
var domainName="mydomain.com";

function onFormSubmit(e) {

  try {
    var timestamp = e.values[0];
    var groupName = e.values[1];
    var groupEmail = e.values[2];
    var owner = e.values[3];

    createGroup(groupName,groupEmail,owner);

    var recipient = "me@mydomain.com";

    var body = 'Group created! '+ groupName;

    var subject = groupName + " Email Group Created"; 
    var advancedArgs = {htmlBody:body , replyTo:email};
    MailApp.sendEmail(recipient, subject, body, advancedArgs);

  } catch(e) {

    MailApp.sendEmail("me@mydomain.com", "Error processing Create New Email Distribution Group form submit", e);

  }
}


function createGroup(groupName,groupEmail,owner) {

  owner = owner.split("@")[0];

  var description = 'test';

  var requestBody = '{"email": "'+groupEmail+'","name": "'+groupName+'","description": "'+description+'"}';

  var scope="https://www.googleapis.com/auth/admin.directory.group";

  var fetchArgs = googleOAuth_("Groups",scope);
  fetchArgs.method = "POST";
  fetchArgs.contentType = "application/json";
  fetchArgs.payload = requestBody;
  fetchArgs.muteHttpExceptions=true;

  var url = 'https://www.googleapis.com/admin/directory/v1/groups?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

  UrlFetchApp.fetch(url, fetchArgs);
}


function googleOAuth_(name,scope) {
  var oAuthConfig = UrlFetchApp.addOAuthService(name)
  oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
  oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
  oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
  oAuthConfig.setConsumerKey(consumerKey);
  oAuthConfig.setConsumerSecret(consumerSecret);
  return {oAuthServiceName:name, oAuthUseToken:'always'};
}

1 个答案:

答案 0 :(得分:3)

我明白了:我在我的代码中犯了一个错误,我在groupEmail字符串之后没有包含域扩展名(因为Google表单只要求用户填写组电子邮件名称​​而不用< / em>域名扩展名)。

我想我应该从stackoverflow中删除这个问题,但我会留在这里记录我的工作oauth身份验证代码,因为:

  1. 当我搞清楚时,这样的事情可以帮助我。

  2. 此处与Google Apps管理SDK目录API相关的帖子不多。

  3. Google不支持此类与开发相关的问题,他们只是指导用户。