gpt4 book ai didi

recursion - 用于复制整个 Google Drive 文件结构的 Google Apps 脚本;如何避免超时?

转载 作者:行者123 更新时间:2023-12-03 08:23:16 24 4
gpt4 key购买 nike

我的单位要改用 Google 企业帐户,每个人都需要将他们的云端硬盘文件转移到新帐户。 Drive 不允许在这些帐户之间转移所有权,因此我创建了一个脚本来将文件和文件夹从旧帐户复制到新帐户。 (旧帐户的内容已移动到与新帐户共享的文件夹中。)

这是我到目前为止所拥有的:

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);
}
};

请原谅任何不雅;我是新手。该脚本实际上运行良好并保留了文件夹结构,但在复制了大约 150 个文件和文件夹后它会超时。我一直在研究如何使用延续 token ,我已经阅读了 this post密切。我想我被困在了概念层面,因为我不确定延续 token 将如何与我设置的递归函数进行交互。看来我最终会得到一堆我的 copySubFolders函数,它们每个都需要自己的延续 token 。当然,它们的迭代器都使用相同的变量名,所以我真的不知道如何设置。

有什么想法吗?很抱歉发布这样一个无助的新手问题;我希望它至少对某人来说是一个有趣的问题。

最佳答案

我想我已经解决了概念问题,尽管我得到了

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



当我尝试执行它时。

基本上,我将它设置为一次只尝试复制一个顶级文件夹,并且对于其中的每个文件夹,它都使用我以前拥有的递归函数。它应该为第一级文件夹和根文件夹中的任何文件保存继续 token ,以便它可以在下一次执行时从它停止的地方开始。这样, token 就不会涉及到我的递归函数堆栈中。
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);
}
};

关于recursion - 用于复制整个 Google Drive 文件结构的 Google Apps 脚本;如何避免超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com