You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Apps Script与服务账户分配Google Workspace许可证?排查404错误

问题解答

核心问题:能否用服务账户+Apps Script分配许可证?

可以。通过服务账户的域范围委派,无需依赖执行脚本的个人用户权限,就能完成Google Workspace许可证的分配操作。前提是要正确配置服务账户的权限和域范围授权。

你的404错误原因及修正

当前代码存在两个关键错误导致404:

1. API端点URL错误

licenseAssignments.listForProduct的正确端点需要包含customer/{customerId}路径段,你的URL缺少该部分。正确格式为:

https://www.googleapis.com/apps/licensing/v1/product/{productId}/customer/{customerId}/users

2. GET请求参数位置错误

GET请求的参数(如customerId)不能放在payload中(payload用于POST/PUT请求的请求体),需要放在URL路径或使用UrlFetchApp的params选项自动拼接。

修正后的代码

function getLicences() {
  var productId = "Google-Apps";
  var customerId = "domain.com"; // 替换为你的域ID或客户ID

  var serviceLicence = getService();
  if (serviceLicence.hasAccess()) {
    // 修正后的API端点
    var url = `https://www.googleapis.com/apps/licensing/v1/product/${productId}/customer/${customerId}/users`;

    var options = {
      headers: {
        'Authorization': 'Bearer ' + serviceLicence.getAccessToken()
      },
      method: 'get',
      muteHttpExceptions: true, // 替换你的debug变量,确保是布尔值
      // GET参数用params字段,而非payload
      params: {
        // 可根据需求添加其他参数,如maxResults、pageToken等
      }
    };

    var response = UrlFetchApp.fetch(url, options);
    if (response.getResponseCode() == 200) {
      var licenceData = JSON.parse(response.getContentText());
      Logger.log(licenceData);
      return licenceData;
    } else {
      Logger.log('Error fetching licences: ' + response.getContentText());
      return null;
    }
  } else {
    Logger.log('Service account does not have access: ' + serviceLicence.getLastError());
    return null;
  }
}

服务账户配置关键点

确保你已经完成以下步骤:

  • 在Google Cloud控制台为服务账户启用Admin SDK Licensing API。
  • 在Google Workspace管理后台,为该服务账户配置域范围委派,添加权限范围:https://www.googleapis.com/auth/apps.licensing。
  • 你的getService()函数必须正确实现服务账户的身份验证,指定上述作用域,并且模拟一个拥有Google Workspace许可证管理权限的域管理员账号(例如:admin@domain.com)。示例getService()实现参考:
function getService() {
  var serviceAccountKey = { /* 你的服务账户JSON密钥内容 */ };
  var impersonatedUser = "admin@domain.com"; // 替换为域管理员邮箱

  return OAuth2.createService('LicensingSA')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(serviceAccountKey.private_key)
    .setIssuer(serviceAccountKey.client_email)
    .setSubject(impersonatedUser)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setScope('https://www.googleapis.com/auth/apps.licensing');
}

许可证分配的额外说明

如果要执行分配许可证操作(而非仅查询),需要调用licenseAssignments.insert接口,确保服务账户同样拥有对应的权限,并且使用正确的SKU ID(Google Workspace Business Standard的SKU ID为Business-Standard)。

内容的提问来源于stack exchange,提问作者Yassine Salah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:06:01