Google Apps脚本复制整个Google云端硬盘文件结构;如何避免超时? [英] Google Apps Script To Copy Entire Google Drive File Structure; How To Avoid Timeouts?

查看:156
本文介绍了Google Apps脚本复制整个Google云端硬盘文件结构;如何避免超时?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的单位正在切换到Google商家帐户,每个人都需要将自己的云端硬盘文件转移到他们的新帐户。云端硬盘不允许在这些帐户之间转让所有权,所以我创建了一个脚本来将文件和文件夹从旧帐户复制到新帐户。 (旧帐户的内容已被移到与新帐户共享的文件夹中。)



以下是我到目前为止的内容:

 函数copyDrive(){
var originFolder = DriveApp.getFolderById(originFolderID);
var destination = DriveApp.getFolderById(destinationID);
copyFiles(originFolder,destination);

};

函数copyFiles(passedFolder,targetFolder){
var fileContents = passedFolder.getFiles();
var file;
var fileName; (fileContents.hasNext()){
file = fileContents.next();


fileName = file.getName();
file.makeCopy(fileName,targetFolder);
}
copySubFolders(passedFolder,targetFolder);
};

函数copySubFolders(passedFolder,targetFolder){
var folderContents = passedFolder.getFolders();
var文件夹;
var folderName;

while(folderContents.hasNext()){
folder = folderContents.next();
folderName = folder.getName();
var subFolderCopy = targetFolder.createFolder(folderName);
copyFiles(folder,subFolderCopy);
}
};

请原谅任何不雅;我是新来的。该脚本实际上效果很好并保留了文件夹结构,但是在复制〜150个文件和文件夹后超时。我一直在研究如何使用连续令牌,并且我已阅读这篇文章密切合作。我想我陷入了概念层面,因为我不确定继续令牌如何与我设置的递归函数相互作用。看起来我最终会得到一堆我的 copySubFolders 函数,并且它们都需要它们自己的继续令牌。当然,他们都为迭代器使用相同的变量名,所以我真的不知道如何设置它。



有什么想法?对不起张贴这样一个无助的新手问题;我希望对某个人来说,这至少是一个有趣的问题。

解决方案

我认为我已经解决了概念问题,尽管我是获得


很抱歉,发生服务器错误。请稍等,然后重试。 (第9行,代码文件)


当我尝试执行它时。



基本上,我将它设置为只尝试一次复制一个顶级文件夹,对于其中的每个文件夹,它都使用我以前的递归函数。它应该为第一级文件夹和根文件夹中的任何文件保存连续令牌,以便在下次执行时停止。这样,这些标记就不会包含在我递归的函数栈中。

 函数copyDrive(){


var originFolder = DriveApp.getFolderById(originFolderID);
var destination = DriveApp.getFolderById(destinationID);

var scriptProperties = PropertiesService.getScriptProperties();
var fileContinuationToken = scriptProperties.getProperty('FILE_CONTINUATION_TOKEN');
var fileIterator = fileContinuationToken == null?
originFolder.getFiles():DriveApp.continueFileIterator(fileContinuationToken);
var folderContinuationToken = scriptProperties.getProperty('FOLDER_CONTINUATION_TOKEN');
var folderIterator = folderContinuationToken == null?
originFolder.getFolders():DriveApp.continueFolderIterator(folderContinuationToken);

尝试{
var rootFileName;
while(fileIterator.hasNext()){
var rootFile = fileIterator.next();
rootFileName = rootFile.getName();
rootFile.makeCopy(rootFileName,destination);
}

var folder = folderIterator.next();
var folderName = folder.getName();
var folderCopy = folder.makeCopy(folderName,destination);


copyFiles(folder,folderCopy);

} catch(err){
Logger.log(err); (fileIterator.hasNext()){
scriptProperties.setProperty('FILE_CONTINUATION_TOKEN',fileIterator.getContinuationToken());
}

if
} else {
scriptProperties.deleteProperty('FILE_CONTINUATION_TOKEN');

if(folderIterator.hasNext()){
scriptProperties.setProperty('FOLDER_CONTINUATION_TOKEN',folderIterator.getContinuationToken());
} else {
scriptProperties.deleteProperty('FOLDER_CONTINUATION_TOKEN');
}

};

函数copyFiles(passedFolder,targetFolder){
var fileContents = passedFolder.getFiles();
var file;
var fileName; (fileContents.hasNext()){
file = fileContents.next();


fileName = file.getName();
file.makeCopy(fileName,targetFolder);
}
copySubFolders(passedFolder,targetFolder);
};

函数copySubFolders(passedFolder,targetFolder){
var subFolderContents = passedFolder.getFolders();
var subFolder;
var subFolderName;

while(folderContents.hasNext()){
subFolder = subFolderContents.next();
subFolderName = subFolder.getName();
var subFolderCopy = targetFolder.createFolder(folderName);
copyFiles(subFolder,subFolderCopy);
}
};


My organization is switching to a Google Business account, and everyone needs to transfer their Drive files to their new accounts. Drive will not allow transfer of ownership between these accounts, so I've created a script to copy files and folders from the old account to the new account. (The old account's contents have been moved into a folder shared with the new account.)

Here's what I have so far:

function copyDrive() {
  var originFolder = DriveApp.getFolderById(originFolderID);
  var destination = DriveApp.getFolderById(destinationID);
  copyFiles(originFolder, destination);

};

function copyFiles(passedFolder, targetFolder) {
  var fileContents = passedFolder.getFiles();
  var file;
  var fileName;

  while(fileContents.hasNext()) {
    file = fileContents.next();
    fileName = file.getName();
    file.makeCopy(fileName, targetFolder);
  }
  copySubFolders(passedFolder, targetFolder);
};

function copySubFolders(passedFolder, targetFolder) {
  var folderContents = passedFolder.getFolders();
  var folder;
  var folderName;

  while(folderContents.hasNext()) {
    folder = folderContents.next();
    folderName = folder.getName();
    var subFolderCopy = targetFolder.createFolder(folderName);
    copyFiles(folder, subFolderCopy);
  }
};

Please pardon any inelegance; I am new at this. The script actually works great and preserves the folder structure, but it times out after copying ~150 files and folders. I've been looking into how to use continuation tokens, and I've read this post closely. I think I'm stuck on a conceptual level, because I'm not sure how the continuation tokens will interact with the recursive functions I've set up. It seems like I will end up with a stack of my copySubFolders function, and they will each need their own continuation tokens. Of course they all use the same variable name for their iterators, so I really have no idea how to set that up.

Any thoughts? Sorry for posting such a helpless newbie question; I hope it will at least be an interesting problem for someone.

解决方案

I think I have solved the conceptual problem, though I am getting

We're sorry, a server error occurred. Please wait a bit and try again. (line 9, file "Code")

when I try to execute it.

Basically, I set it up to only try to copy one top-level folder at a time, and for each one of those it uses the recursive functions I had before. It should save continuation tokens for that first level of folders and any files in the root folder so it can pick up in the next execution where it left off. This way, the tokens are not involved in my recursive stack of functions.

function copyDrive() {


  var originFolder = DriveApp.getFolderById(originFolderID);
  var destination = DriveApp.getFolderById(destinationID);

  var scriptProperties = PropertiesService.getScriptProperties();
  var fileContinuationToken = scriptProperties.getProperty('FILE_CONTINUATION_TOKEN');
  var fileIterator = fileContinuationToken == null ?
    originFolder.getFiles() : DriveApp.continueFileIterator(fileContinuationToken);
  var folderContinuationToken = scriptProperties.getProperty('FOLDER_CONTINUATION_TOKEN');
  var folderIterator = folderContinuationToken == null ?
    originFolder.getFolders() : DriveApp.continueFolderIterator(folderContinuationToken);

  try {
    var rootFileName;
    while(fileIterator.hasNext()) {
      var rootFile = fileIterator.next();
      rootFileName = rootFile.getName();
      rootFile.makeCopy(rootFileName, destination);
      }

    var folder = folderIterator.next();
    var folderName = folder.getName();
    var folderCopy = folder.makeCopy(folderName, destination);


    copyFiles(folder, folderCopy);

  } catch(err) {
    Logger.log(err);
  }

  if(fileIterator.hasNext()) {
    scriptProperties.setProperty('FILE_CONTINUATION_TOKEN', fileIterator.getContinuationToken());
  } else {
    scriptProperties.deleteProperty('FILE_CONTINUATION_TOKEN');
  }
  if(folderIterator.hasNext()) {
    scriptProperties.setProperty('FOLDER_CONTINUATION_TOKEN', folderIterator.getContinuationToken());
  } else {
    scriptProperties.deleteProperty('FOLDER_CONTINUATION_TOKEN');
  }

};

function copyFiles(passedFolder, targetFolder) {
  var fileContents = passedFolder.getFiles();
  var file;
  var fileName;

  while(fileContents.hasNext()) {
    file = fileContents.next();
    fileName = file.getName();
    file.makeCopy(fileName, targetFolder);
  }
  copySubFolders(passedFolder, targetFolder);
};

function copySubFolders(passedFolder, targetFolder) {
  var subFolderContents = passedFolder.getFolders();
  var subFolder;
  var subFolderName;

  while(folderContents.hasNext()) {
    subFolder = subFolderContents.next();
    subFolderName = subFolder.getName();
    var subFolderCopy = targetFolder.createFolder(folderName);
    copyFiles(subFolder, subFolderCopy);
  }
};

这篇关于Google Apps脚本复制整个Google云端硬盘文件结构;如何避免超时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆