【发布时间】:2015-04-30 07:05:54
【问题描述】:
我有一个 Google Apps 脚本函数,用于为我们的 Google Apps 域中的新员工设置帐户。
它做的第一件事是调用Google Admin Settings API 并检索 currentNumberOfUsers 和 maximumNumberOfUsers,因此它可以查看是否有可用座位(否则后续使用Admin SDK Directory API 创建用户的步骤将失败)。
直到最近我们的域不得不从 Postini 迁移到 Google Vault 以进行电子邮件归档时,它一直运行良好。
在迁移之前,当使用 Admin SDK Directory API 创建 Google Apps 用户时,它会将 currentNumberOfUsers 增加 1,新的用户帐户用户将自动有权访问所有 Google Apps 服务。
现在迁移后,在创建 Google Apps 用户时,不会自动为他们分配“许可证”,因此我修改了我的脚本以使用 @987654324 @ 现在它分配了一个"Google-Apps-For-Business" 许可证。效果很好。
但是,currentNumberOfUsers 现在与分配的许可证数量不同,"Google-Apps-For-Business" 只是one of several different types of licenses available。 p>
我可以通过运行以下命令获得当前分配 "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 获得域可用的最大数量。
【问题讨论】:
-
似乎唯一的方法是申请将您的帐户设置为经销商。似乎是对 ELM api 的疏忽。
-
这就是我想的,是的。所以我要申请成为自己的经销商。不幸的是,我认为一个 Google Apps 帐户只能有一个经销商,这意味着我必须放弃我当前的经销商。
-
2016 年 8 月更新:我们甚至无法获得 currentNumberOfUsers - Google 已宣布他们是 shutting down the Admin Settings API。
标签: api google-apps-script google-api google-apps