api - 用于在 Google Apps 域中获取最大许可数的 Google API

标签 api google-apps-script google-api google-apps

我有一个 Google Apps 脚本函数,用于在我们的 Google Apps 域中为新员工设置帐户。

它做的第一件事是调用 Google Admin Settings API并检索 currentNumberOfUsers 最大用户数 ,因此它可以查看是否有可用座位(否则使用 Admin SDK Directory API 创建用户的后续步骤将失败)。

直到最近我们的域不得不从 Postini 迁移到 Google 保险柜以进行电子邮件存档时,它一直运行良好。

之前 迁移,在使用 Admin SDK Directory API 创建 Google Apps 用户时,它会增加 currentNumberOfUsers 1 并且新用户帐户用户将自动有权访问所有 Google Apps 服务。

现在之后 在迁移过程中,创建 Google Apps 用户时,不会自动为他们分配“许可”,因此我修改了脚本以使用 Enterprise License Manager API现在它分配了一个 "Google-Apps-For-Business"执照。这很好用。

然而, currentNumberOfUsers 现在与分配的许可证数量不同,并且 "Google-Apps-For-Business"只是 one of several different types of licenses available .

我可以得到的当前号码已分配 "Google-Apps-For-Business"通过运行这个许可证:

var currentXml = AdminLicenseManager.LicenseAssignments.listForProductAndSku('Google-Apps', 'Google-Apps-For-Business', 'domain.com', {maxResults: 1000});
    
var current = currentXml.items.toString().match(/\/sku\/Google-Apps-For-Business\/user\//g).length;


但是产生的数字与不同currentNumberOfUsers .

我现在真正需要做的就是获取 最大 拥有数量"Google-Apps-For-Business"许可证,以便新员工设置脚本可以确定是否有任何可用的许可证。

我检查了以下 API 的 API 引用文档,但是...

Enterprise License Manager API → 没有获取最大或可用许可证数量的方法。

Google Admin Settings API → 不处理许可证,只处理“用户”。

Admin SDK Directory API User resource → 不涉及许可证。

Google Apps Reseller API → 这个 API 似乎有我需要的东西,但是 it's only for Reseller accounts .

我知道我可以对我的新员工设置脚本进行编程,以便尝试/捕获它是否能够创建用户并分配许可证,如果不能,则优雅地结束脚本执行,但这似乎不是高效的。

此外,旧脚本的一部分是,如果可用座位少于 X 个,它会通过电子邮件提醒我订购更多。我可以编写一个循环,尝试重复创建虚拟用户并为他们分配许可证,并在失败之​​前计算它可以执行此操作的次数,然后删除所有虚拟用户,但是,再一次,这根本没有效率。

有任何想法吗?

2020 年 3 月 11 日更新 :自从几年前 Admin Settings API 关闭以来,我一直在使用 Enterprise License Manager API 来获取当前使用的许可证数量,如下所示:
function getCurrentNumberOfUsedGoogleLicenses(skuId) {

  var success = false, error = null, count = 0;

  var adminEmail = 'admin@domain.com';
  var gSuiteDomain = adminEmail.split('@')[1];

  // for more information on the domain-wide delegation:
  // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
  // the getDomainWideDelegationService() function uses this: 
  // https://github.com/gsuitedevs/apps-script-oauth2
  var service = getDomainWideDelegationService('EnterpriseLicenseManager: ', 'https://www.googleapis.com/auth/apps.licensing', adminEmail);

  if (skuId == 'Google-Apps-Unlimited') var productId = 'Google-Apps';
  else                                  return { success: success, error: "Unsupported skuId", count: count };

  var requestBody                = {};
  requestBody.headers            = {'Authorization': 'Bearer ' + service.getAccessToken()};
  requestBody.method             = "GET";
  requestBody.muteHttpExceptions = false;

  var data, pageToken, pageTokenString;

  var maxAttempts     = 5;
  var currentAttempts = 0;
  var pauseBetweenAttemptsSeconds = 3;

  loopThroughPages:
  do {

    if (typeof pageToken === 'undefined') pageTokenString = "";
    else                                  pageTokenString = "&pageToken=" + encodeURIComponent(pageToken);

    var url = 'https://www.googleapis.com/apps/licensing/v1/product/' + productId + '/sku/' + skuId + '/users?maxResults=1000&customerId=' + gSuiteDomain + pageTokenString;

    try {

      currentAttempts++;

      var response = UrlFetchApp.fetch(url, requestBody);

      var result = JSON.parse(response.getContentText());

      if (result.items) {

        var licenseAssignments = result.items;
        var licenseAssignmentsString = '';

        for (var i = 0; i < licenseAssignments.length; i++) {

          licenseAssignmentsString += JSON.stringify(licenseAssignments[i]);

        }

        if (skuId == 'Google-Apps-Unlimited') count += licenseAssignmentsString.match(/\/sku\/Google-Apps-Unlimited\/user\//g).length;

        currentAttempts = 0; // reset currentAttempts before the next page

      }

    } catch(e) {

      error = "Error: " + e.message;

      if (currentAttempts >= maxAttempts) {

        error = 'Exceeded ' + maxAttempts + ' attempts to get license count: ' + error;

        break loopThroughPages;

      }

    } // end of try catch

    if (result) pageToken = result.nextPageToken;

  } while (pageToken);

  if (!error) success = true;

  return { success: success, error: error, count: count };

}

但是,似乎仍然没有办法使用此 API 获得域可用的最大数量。

最佳答案

使用 CustomerUsageReports .

jay0lee 很友好地提供了 GAM Python中的源代码。我粗略地修改了doGetCustomerInfo()从而在 Apps 脚本中发挥作用:

function getNumberOfLicenses() {
  var tryDate = new Date();
  var dateString = tryDate.getFullYear().toString() + "-" + (tryDate.getMonth() + 1).toString() + "-" + tryDate.getDate().toString();
  while (true) {
    try {
      var response = AdminReports.CustomerUsageReports.get(dateString,{parameters : "accounts:gsuite_basic_total_licenses,accounts:gsuite_basic_used_licenses"});
      break;
    } catch(e) {
      //Logger.log(e.warnings.toString());
      tryDate.setDate(tryDate.getDate()-1);
      dateString = tryDate.getFullYear().toString() + "-" + (tryDate.getMonth() + 1).toString() + "-" + tryDate.getDate().toString();
      continue;
    }
  };
  var availLicenseCount = response.usageReports[0].parameters[0].intValue;
  var usedLicenseCount = response.usageReports[0].parameters[1].intValue;
  Logger.log("Available licenses:" + availLicenseCount.toString());
  Logger.log("Used licenses:" + usedLicenseCount.toString());
  return availLicenseCount;
}

关于api - 用于在 Google Apps 域中获取最大许可数的 Google API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961154/

相关文章:

javascript - 在不同的方法中再次使用 componentDidMount 的 fetch 方法

google-apps-script - 将一个范围从一个电子表格复制到另一个电子表格

javascript - 在 Google Sheet 的新选项卡或窗口中触发网站

google-api - 使用Google Play开发者API进行服务器端授权?

javascript - 如何将 JQuery 实例方法作为 Google API 回调发送?

ruby-on-rails - Google-api-client 请求访问 token

java - 如何创建我自己的 android 库并托管它

c++ - USB 端口的 Windows 窗体应用程序

javascript - 为什么我无法从 Marvel 读取此 Web api?

google-apps-script - Google 表格 - googlefinance 无法正常工作