用于获取团队驱动器访问权限的 Apps 脚本 API
Appscript API for fetching access permissions of team drive
我正在尝试生成一份报告,其中包含当前不同用户在团队云端硬盘中拥有的所有访问权限。 Appscript 中是否有任何 API 来获取此数据?
似乎没有任何方法可以获取按用户名排序的 Drive 权限,因此您需要自己实现此业务逻辑。根据文档,向下面的 API 端点发送 GET 请求将为您提供团队驱动器的权限列表(使用团队驱动器 ID 而不是文件 ID):
https://www.googleapis.com/drive/v3/files/fileId/permissions
我没有设置任何团队云端硬盘 - 下面的示例基于使用云端硬盘 REST API 获取单个文件的权限。在执行代码之前,您必须通过在 URL 参数中包含 API 密钥并在“GET”请求的 headers 中传递 OAuth 令牌来证明您的身份。
API 密钥可以从 Google 云控制台获取。启用驱动器 API 并单击左侧菜单中的钥匙图标以设置凭据。从 drop-down 中选择 "API key" 并复制值。
您的脚本必须将包含所有必需授权范围的令牌传递给 API 端点。 OAuth 范围在清单文件中明确设置。在脚本编辑器中,select "View - Show manifest file" 并添加相关范围。我的清单文件中使用的范围用于访问云端硬盘文件和通过 UrlFetchApp 调用外部服务:
"oauthScopes": [
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/script.external_request"]
最后,获取文件的权限列表:
var fileId = "FILE_ID";
var apiKey = "API_KEY";
var apiUrl = "https://www.googleapis.com/drive/v3/files/fileId/permissions";
var token = ScriptApp.getOAuthToken();
var header = {"Authorization":"Bearer " + token};
var options = {
"method":"GET",
"headers": header,
"muteHttpExceptions": true
};
var res = UrlFetchApp.fetch(apiUrl.replace("fileId", fileId) + "?key=" + apiKey, options)
.getContentText();
var permissions = JSON.parse(res);
Logger.log(permissions);
在 Anton 的 回答的帮助下更新。 (也与 Appmaker 合作)。
下面是我是如何实现的,
function fileExport(folderId) //pass folder id or drive/team drive id to fetch permissions
{
var parent = DriveApp.getFolderById(folderId);
var path = DriveApp.getFolderById(folderId).getName();
var fileName = 'Permisssions_' + new Date(); //define file name
var newExport = SpreadsheetApp.create(fileName); // create new spreadsheet
var header = ["Path","Folder","File Name","Email","Role","Name","DocUrl"]; //define header
newExport.appendRow(header); // append header to spreadsheet
newExport.setFrozenRows(1);
newExport.getRange("A1:H1").setFontWeight("bold");
//traverse through each folder under current folder
getChildFolders(parent,newExport,path);
//appned files associated with current folder
var files = parent.getFiles();
while (files.hasNext()) {
var file = files.next();
var permitFile= makeRestCall(file.getId());
for(var j=0; j<permitFile.length;j++)
{
newExport.appendRow([path,'',file.getName(),permitFile[j].emailAddress, permitFile[j].role,permitFile[j].displayName,file.getUrl()]);
}
}
return 'File exported successfully to this path:'+ newExport.getUrl();
}
//Iterate through child folders using recursive call
function getChildFolders(parent,newExport,path) {
var childFolders = parent.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
path = path +'--'+childFolder.getName();
var permit= makeRestCall(childFolder.getId());
for(var i=0; i<permit.length;i++)
{
newExport.appendRow([path,childFolder.getName(),'',permit[i].emailAddress, permit[i].role,permit[i].displayName,childFolder.getUrl()]);
}
var files = childFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
var permitFile= makeRestCall(file.getId());
for(var j=0; j<permitFile.length;j++)
{
newExport.appendRow([path,'',file.getName(),permitFile[j].emailAddress, permitFile[j].role,permitFile[j].displayName,file.getUrl()]);
}
}
// Recursive call for any sub-folders
getChildFolders(childFolder,newExport,path);
}
}
function makeRestCall(fileOrFolderId) //make rest call to fetch permissions
{
var apiUrl = "https://www.googleapis.com/drive/v3/files/fileId/permissions";
var token = ScriptApp.getOAuthToken();
var header = {"Authorization":"Bearer " + token};
var options = {
"method":"GET",
"headers": header
};
var response = UrlFetchApp.fetch(apiUrl.replace("fileId", fileOrFolderId) + "?supportsTeamDrives=true&fields=*", options)
.getContentText();
var dataAll = JSON.parse(response);
var permit = dataAll.permissions;
return permit;
}
我正在尝试生成一份报告,其中包含当前不同用户在团队云端硬盘中拥有的所有访问权限。 Appscript 中是否有任何 API 来获取此数据?
似乎没有任何方法可以获取按用户名排序的 Drive 权限,因此您需要自己实现此业务逻辑。根据文档,向下面的 API 端点发送 GET 请求将为您提供团队驱动器的权限列表(使用团队驱动器 ID 而不是文件 ID):
https://www.googleapis.com/drive/v3/files/fileId/permissions
我没有设置任何团队云端硬盘 - 下面的示例基于使用云端硬盘 REST API 获取单个文件的权限。在执行代码之前,您必须通过在 URL 参数中包含 API 密钥并在“GET”请求的 headers 中传递 OAuth 令牌来证明您的身份。 API 密钥可以从 Google 云控制台获取。启用驱动器 API 并单击左侧菜单中的钥匙图标以设置凭据。从 drop-down 中选择 "API key" 并复制值。
您的脚本必须将包含所有必需授权范围的令牌传递给 API 端点。 OAuth 范围在清单文件中明确设置。在脚本编辑器中,select "View - Show manifest file" 并添加相关范围。我的清单文件中使用的范围用于访问云端硬盘文件和通过 UrlFetchApp 调用外部服务:
"oauthScopes": [
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/script.external_request"]
最后,获取文件的权限列表:
var fileId = "FILE_ID";
var apiKey = "API_KEY";
var apiUrl = "https://www.googleapis.com/drive/v3/files/fileId/permissions";
var token = ScriptApp.getOAuthToken();
var header = {"Authorization":"Bearer " + token};
var options = {
"method":"GET",
"headers": header,
"muteHttpExceptions": true
};
var res = UrlFetchApp.fetch(apiUrl.replace("fileId", fileId) + "?key=" + apiKey, options)
.getContentText();
var permissions = JSON.parse(res);
Logger.log(permissions);
在 Anton 的 回答的帮助下更新。 (也与 Appmaker 合作)。
下面是我是如何实现的,
function fileExport(folderId) //pass folder id or drive/team drive id to fetch permissions
{
var parent = DriveApp.getFolderById(folderId);
var path = DriveApp.getFolderById(folderId).getName();
var fileName = 'Permisssions_' + new Date(); //define file name
var newExport = SpreadsheetApp.create(fileName); // create new spreadsheet
var header = ["Path","Folder","File Name","Email","Role","Name","DocUrl"]; //define header
newExport.appendRow(header); // append header to spreadsheet
newExport.setFrozenRows(1);
newExport.getRange("A1:H1").setFontWeight("bold");
//traverse through each folder under current folder
getChildFolders(parent,newExport,path);
//appned files associated with current folder
var files = parent.getFiles();
while (files.hasNext()) {
var file = files.next();
var permitFile= makeRestCall(file.getId());
for(var j=0; j<permitFile.length;j++)
{
newExport.appendRow([path,'',file.getName(),permitFile[j].emailAddress, permitFile[j].role,permitFile[j].displayName,file.getUrl()]);
}
}
return 'File exported successfully to this path:'+ newExport.getUrl();
}
//Iterate through child folders using recursive call
function getChildFolders(parent,newExport,path) {
var childFolders = parent.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
path = path +'--'+childFolder.getName();
var permit= makeRestCall(childFolder.getId());
for(var i=0; i<permit.length;i++)
{
newExport.appendRow([path,childFolder.getName(),'',permit[i].emailAddress, permit[i].role,permit[i].displayName,childFolder.getUrl()]);
}
var files = childFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
var permitFile= makeRestCall(file.getId());
for(var j=0; j<permitFile.length;j++)
{
newExport.appendRow([path,'',file.getName(),permitFile[j].emailAddress, permitFile[j].role,permitFile[j].displayName,file.getUrl()]);
}
}
// Recursive call for any sub-folders
getChildFolders(childFolder,newExport,path);
}
}
function makeRestCall(fileOrFolderId) //make rest call to fetch permissions
{
var apiUrl = "https://www.googleapis.com/drive/v3/files/fileId/permissions";
var token = ScriptApp.getOAuthToken();
var header = {"Authorization":"Bearer " + token};
var options = {
"method":"GET",
"headers": header
};
var response = UrlFetchApp.fetch(apiUrl.replace("fileId", fileOrFolderId) + "?supportsTeamDrives=true&fields=*", options)
.getContentText();
var dataAll = JSON.parse(response);
var permit = dataAll.permissions;
return permit;
}