Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 无法在应用程序脚本中授权Google数据传输API_Google Apps Script_Google Admin Sdk - Fatal编程技术网

Google apps script 无法在应用程序脚本中授权Google数据传输API

Google apps script 无法在应用程序脚本中授权Google数据传输API,google-apps-script,google-admin-sdk,Google Apps Script,Google Admin Sdk,我有一个Appscript应用程序,用于在G套件域上执行各种功能。我想添加使用传输用户数据的功能,但在授权服务时遇到了问题。我在授权gmail、驱动器和目录API方面没有任何问题,并且我确保该服务在GCP项目中启用。但是,我无法让我的OAuth2服务进行授权,我每次都会收到一条记录消息,表明我的服务帐户未经授权。这里少了什么 这是我的密码: const migrationScope = ['https://www.googleapis.com/auth/admin.datatransfer'];

我有一个Appscript应用程序,用于在G套件域上执行各种功能。我想添加使用传输用户数据的功能,但在授权服务时遇到了问题。我在授权gmail、驱动器和目录API方面没有任何问题,并且我确保该服务在GCP项目中启用。但是,我无法让我的OAuth2服务进行授权,我每次都会收到一条记录消息,表明我的服务帐户未经授权。这里少了什么

这是我的密码:

const migrationScope = ['https://www.googleapis.com/auth/admin.datatransfer'];

function migrateUser(sourceUser, targetUser, type) {
  var url = 'https://www.googleapis.com/admin/datatransfer/v1/transfers';
  var service = getService_('superadmin_account@company.com', 'admin', migrationScope);
  var transferObject = {
    oldOwnerUSerId: getUserId(sourceUser), // this takes an email and returns the user ID which is required by the API
    newOwnerUserId: getUserId(targetUser),
    applicationDataTransfers: [
      {
        applicationTransferParams: [
          {
            value: type,
          }
        ],
        applicationId: 5********6 // Our App ID for Drive
      }
    ]
  }
  if (service.hasAccess()) {
    var response = UrlFetchApp.fetch(url, requestBuilder(service, transferObject, 'POST'));
    try {
      var result = JSON.parse(response.getContentText());
      return (result);
    }
    catch (e) {
      return (undefined);
    }
  } else { Logger.log("Service does not have access to migrate content."); }
}

function getService_(email, service, scopes) {
  return OAuth2.createService(service + ':' + email)
    .setTokenUrl('https://oauth2.googleapis.com/token').
    .setPrivateKey(PRIVATE_KEY)
    .setIssuer(CLIENT_EMAIL)
    .setSubject(email)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setScope(scopes);
}
function requestBuilder(service, payload, method) {
  return {
    method: method,
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };
}

假设
requestBuilder
为调用返回格式正确的高级参数,那么代码本身似乎没有问题

考虑到您遇到的错误类型,我认为您没有添加范围
https://www.googleapis.com/auth/admin.datatransfer
在管理控制台的域范围委派窗格中

当使用服务帐户模拟其他用户时,您需要将服务帐户应该能够访问的任何作用域添加到此窗格。仅在GCP项目上启用API或将范围添加到同意屏幕是不够的。你也需要在那里添加它们

为此,请按照规定执行以下步骤:

然后,G套件域的超级管理员必须完成以下步骤:

1。从您的G套件域,转到主菜单>安全>API控件
2。在域范围委派窗格中,选择管理域范围委派
3。单击添加新的
4。在客户ID字段中,输入服务帐户的客户ID。您可以在中找到服务帐户的客户端ID。
5。在OAuth作用域(逗号分隔)
字段中,输入应用程序应被授予访问权限的作用域列表。例如,如果您的应用程序需要对Google Drive API和Google Calendar API进行全域完全访问,请输入:
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/calendar

6。单击授权

重要提示:
  • 确保服务帐户模拟的用户(
    .setSubject(email)
    )具有实际传输数据的适当管理员权限
参考:

谢谢,我完全忘记了更新该页面,所以我添加了范围并等待了一段时间,但似乎我仍然收到了错误。我尝试将
setSubject
用户设置为超级管理员帐户和具有驱动器设置和数据传输管理员角色的帐户,但我得到了相同的错误。我还将我的请求生成器功能添加到问题中。没关系,明白了!在尝试调试时,我在其他地方遇到了一些问题。非常感谢。