Google drive api 如何访问Google Drive中给定文档ID的活动历史记录,以便使用Google Drive API恢复数据?
google drive应用程序中的一个bug导致用户意外地孤立了共享文件夹中的数千个文档 通过查看管理控制台,我能够获取这些文档的ID,但无法获取相关文件夹的ID(我获取文件夹的名称,但文件夹名称不是唯一的,我正在处理数千个文档和数百个文件夹) 如果任何给定的用户搜索孤立文档,他们都可以找到该文档,通过单击该文档,可以在“活动”窗格中查看有关文档何时从其主页中删除以及从何处删除的信息 我认为编写解决方案脚本的最佳方法是:Google drive api 如何访问Google Drive中给定文档ID的活动历史记录,以便使用Google Drive API恢复数据?,google-drive-api,google-admin-audit-api,Google Drive Api,Google Admin Audit Api,google drive应用程序中的一个bug导致用户意外地孤立了共享文件夹中的数千个文档 通过查看管理控制台,我能够获取这些文档的ID,但无法获取相关文件夹的ID(我获取文件夹的名称,但文件夹名称不是唯一的,我正在处理数千个文档和数百个文件夹) 如果任何给定的用户搜索孤立文档,他们都可以找到该文档,通过单击该文档,可以在“活动”窗格中查看有关文档何时从其主页中删除以及从何处删除的信息 我认为编写解决方案脚本的最佳方法是: For each google document ID... -&
For each google document ID...
-> Access the activity history and grab the "removed from folder" event
-> Get the FolderID from that event (surely that exists and there's API access, right?)
-> Reparent the folder
问题是如何获得我需要的对FolderID的API访问
请注意,在此期间,我有以下代码,有时但并不总是能够为我获取父文件夹(它似乎经常失败,对我的整个问题毫无用处)
请注意,这段代码的另一个问题是,在运行几次之后,速度会大大减慢——getId()上的try/catch正在折磨我,但我不知道每个文件的所有者,因此我必须尝试找出答案。管理报告API是实际解决方案的关键: 使用该API,可以提取孤立文件夹上的数据。一旦有了这些数据,就可以相对简单地创建一个脚本来读取文档ID和文件夹ID,并将文档放回文件夹中,尽管该脚本必须根据相关文档的创建者运行 下面是从API中获取数据的脚本片段:
function generateLoginActivityReport() {
var now = new Date();
// Assumes a one week time horizon -- modify as you see fit...
var oneWeekAgo = new Date(now.getTime() - 8 * 24 * 60 * 60 * 1000);
var startTime = oneWeekAgo.toISOString();
var endTime = now.toISOString();
var rows = [];
var pageToken, page;
do {
/*
page = AdminReports.Activities.list('all', 'login', {
startTime: startTime,
endTime: endTime,
maxResults: 500,
pageToken: pageToken
});
*/
page = AdminReports.Activities.list('name-of-user-who-accidentally-borked-drive@innovationcharter.org','drive', {
startTime:startTime,
endTime:endTime,
maxResults: 200,
eventName: 'remove_from_folder',
//name: 'remove_from_folder',
pageToken: pageToken});
var items = page.items;
if (items) {
for (var i = 0; i < items.length; i++) {
//for (var i = 0; i < 2; i++) {
var item = items[i];
// Get the parameters out of the mess of crap that is their parameters...
// Google serves them up this way [{} {} {} {}] instead of in a normal
// object like we're going to create in params
params = {}
for (var idx=0; idx < item.events[0].parameters.length; idx++) {
param = item.events[0].parameters[idx]
var val = false
if (param['multiValue']) {
var val = param['multiValue']
}
if (param['value']) {
var val = param['value']
}
if (param['boolValue']) {
var val = param['boolValue']
}
params[param['name']] = val
}
// Now go ahead and push a row to the spreadsheet with all
// the data we need
var row = [
new Date(item.id.time),
item.actor.email,
item.events[0].name,
params['doc_title'],
params['doc_id'],
params['source_folder_title'],
params['source_folder_id'],
params['owner'], // You'll need the owner because the
// owner has to recover the file
];
rows.push(row);
}
}
pageToken = page.nextPageToken;
} while (pageToken);
if (rows.length > 0) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet('Files Removed from Folder');
// Append the headers.
var headers = ['Time', 'User', 'Event','Doc Title','Doc','Folder Title','Folder','Owner'];
sheet.appendRow(headers);
// Append the results.
sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
//Logger.log('Report spreadsheet created: %s', spreadsheet.getUrl());
} else {
Logger.log('No results returned.');
}
}
函数generateLoginActivityReport(){
var now=新日期();
//假设一周的时间范围--根据您的需要进行修改。。。
var oneWeekAgo=新日期(now.getTime()-8*24*60*60*1000);
var startTime=oneWeekAgo.toISOString();
var endTime=now.toISOString();
var行=[];
var pageToken,page;
做{
/*
page=AdminReports.Activities.list('all','login','{
开始时间:开始时间,
endTime:endTime,
最大结果:500,
pageToken:pageToken
});
*/
page=AdminReports.Activities.list('name-of-user-who-borked-drive@innovationcharter.org","驾驶",{
开始时间:开始时间,
endTime:endTime,
最大结果:200,
eventName:'remove_from_folder',
//名称:“从\u文件夹中删除\u”,
pageToken:pageToken});
var items=page.items;
若有(项目){
对于(变量i=0;i0){
var sheet=SpreadsheetApp.getActiveSpreadsheet().insertSheet('从文件夹中删除的文件');
//附加标题。
var headers=['Time','User','Event','doctitle','Doc','foldertitle','Folder','Owner'];
表.附录行(标题);
//附加结果。
sheet.getRange(2,1,rows.length,headers.length).setValues(rows);
//Logger.log('创建的报表电子表格:%s',电子表格.getUrl());
}否则{
Logger.log('没有返回结果');
}
}
这个可爱的脚本生成了一个电子表格,其中包含了我们提取数据所需的数据。下面是程序的第2部分——一个脚本,用于逐行检查数据并恢复我们可以恢复的文件
function recoverSheet () {
DOCID = 5; // 1-INDEXED COL HEADERS
FOLDERID = 7;
OWNER = 8;
RECOVERED = 9;
DOC_LINK = 10;
FOLDER_LINK = 11;
EXTRA_PARENTS = 12;
sheet = SpreadsheetApp.getActiveSheet()
total_range = sheet.getDataRange();
for (var rownum=2; rownum<=total_range.getLastRow(); rownum++) {
// Iterate through each row...
var range = sheet.getRange(
'A'+rownum+':'+'I'+rownum // Where your data is...
)
docID=range.getCell(1,DOCID).getValue();
if (range.getCell(1,RECOVERED).getValue()) {
Logger.log('Skipping '+docID+' - already recovered');
}
else {
if (range.getCell(1,OWNER).getValue()==currentUser) {
folderID = range.getCell(1,FOLDERID).getValue();
try {
folder = DriveApp.getFolderById(folderID); // get folder...
file = DriveApp.getFileById(docID);
}
catch (exc) {
Logger.log('Failed to get file or folder :( for docID '+docID+' folderID '+folderID);
range.getCell(1,RECOVERED).setValue('FAILED');
file = false
}
if (file) {
folder.addFile(file);
// Add nice little links to make it handy to see what we recovered
sheet.getRange(rownum,RECOVERED,1,1).setValue('True'); // Set Recovered
sheet.getRange(rownum,DOC_LINK,1,1).setValue('https://drive.google.com/open?id='+docID);
sheet.getRange(rownum,FOLDER_LINK,1,1).setValue('https://drive.google.com/open?id='+folderID);
recovery = recoverFile(docID) // Do any extra recovery we can...
if (recovery) {
Logger.log('Successful extra recovery: '+recovery);
//range.getCell(1,4).setValue(recovery.file.getOwner().getEmail()); // set Owner of document
for (var i=0; i<recovery.parents.length; i++) {
sheet.getRange(rownum,EXTRA_PARENTS+i).setValue('https://drive.google.com/open?id='+recovery.parents[i].getId());
}
}
}
}}
}
}
函数恢复表(){
DOCID=5;//1索引列标题
FOLDERID=7;
所有者=8;
恢复=9;
DOC_LINK=10;
文件夹链接=11;
额外的父母=12;
sheet=SpreadsheetApp.getActiveSheet()
total_range=sheet.getDataRange();
for(var rownum=2;rownumcurious)关于咬你的错误:用户是否有可能将驱动器同步客户端配置为仅同步证书
function recoverSheet () {
DOCID = 5; // 1-INDEXED COL HEADERS
FOLDERID = 7;
OWNER = 8;
RECOVERED = 9;
DOC_LINK = 10;
FOLDER_LINK = 11;
EXTRA_PARENTS = 12;
sheet = SpreadsheetApp.getActiveSheet()
total_range = sheet.getDataRange();
for (var rownum=2; rownum<=total_range.getLastRow(); rownum++) {
// Iterate through each row...
var range = sheet.getRange(
'A'+rownum+':'+'I'+rownum // Where your data is...
)
docID=range.getCell(1,DOCID).getValue();
if (range.getCell(1,RECOVERED).getValue()) {
Logger.log('Skipping '+docID+' - already recovered');
}
else {
if (range.getCell(1,OWNER).getValue()==currentUser) {
folderID = range.getCell(1,FOLDERID).getValue();
try {
folder = DriveApp.getFolderById(folderID); // get folder...
file = DriveApp.getFileById(docID);
}
catch (exc) {
Logger.log('Failed to get file or folder :( for docID '+docID+' folderID '+folderID);
range.getCell(1,RECOVERED).setValue('FAILED');
file = false
}
if (file) {
folder.addFile(file);
// Add nice little links to make it handy to see what we recovered
sheet.getRange(rownum,RECOVERED,1,1).setValue('True'); // Set Recovered
sheet.getRange(rownum,DOC_LINK,1,1).setValue('https://drive.google.com/open?id='+docID);
sheet.getRange(rownum,FOLDER_LINK,1,1).setValue('https://drive.google.com/open?id='+folderID);
recovery = recoverFile(docID) // Do any extra recovery we can...
if (recovery) {
Logger.log('Successful extra recovery: '+recovery);
//range.getCell(1,4).setValue(recovery.file.getOwner().getEmail()); // set Owner of document
for (var i=0; i<recovery.parents.length; i++) {
sheet.getRange(rownum,EXTRA_PARENTS+i).setValue('https://drive.google.com/open?id='+recovery.parents[i].getId());
}
}
}
}}
}
}