我有一个 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/