我正在尝试使用通过 Google 表单发布的信息创建文档,然后一旦创建文档,我想将该文档移至共享文件夹中以供人们查看。
目前,我的脚本从 Google Forms 链接的电子表格中获取所有信息。
使用该信息,我使用以下代码来创建文档:
var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
var newDoc = DocumentApp.create(requestID + " - " + requestSummary);
这已在我的 Google Drive 根文件夹中成功创建文档,但我似乎无法将其移动到我想要移动的位置。
我看过很多帖子建议使用诸如 targetFolder.addFile(newDoc) 之类的东西,但这不起作用,同样我也见过像 newDoc.addToFolder(targetFolder) 这样的例子,但这对我来说不起作用。
似乎人们已经提出的所有在线问题都使用不再适用的以前的 API 版本,并且这些方法不适用于新的 DriveApp 功能。
如果可能的话,我想要的是创建上述新文档,以便我可以使用脚本编辑内容,然后能够将该文件移动到共享文件夹。 (据我了解,目前没有“移动”功能,因此复制并删除旧的就足够了)。
如果我们复制文件并丢弃原始文件,则会更改文件 URL,并且文件共享设置也不会保留。
在云端硬盘中,可以使用 .addFolder()
服务的
DriveApp
方法将文件添加到多个文件夹。您可以将文件添加到目标文件夹,然后从直接父文件夹中删除文件。
function moveFiles(sourceFileId, targetFolderId) {
var file = DriveApp.getFileById(sourceFileId);
var folder = DriveApp.getFolderById(targetFolderId);
file.moveTo(folder);
}
这是我的第一篇文章!我知道这个问题已经被回答过几次了,但实际上我在处理我的项目时遇到了这个问题,并且在查看 Apps 脚本文档时,我找到了一种简洁的方法来做到这一点。 some1 答案的变体。
var file = DriveApp.getFileById(fileid);
DriveApp.getFolderById(folderid).addFile(file);
DriveApp.getRootFolder().removeFile(file);
希望有帮助!
看起来现在有一个带有 Drive API(高级服务)的 moveTo() 函数,可以轻松移动文件:
移动到(目的地)
将此项目移动到提供的目标文件夹。
当前用户必须是该文件的所有者或至少具有编辑权限 访问项目的当前父文件夹以移动项目 到目标文件夹。
这是我用来将所有文件从“屏幕截图输入”文件夹移动到“屏幕截图处理”文件夹的一些代码:
var inputFolder = DriveApp.getFolderById(SCREENSHOT_INPUT_FOLDER_ID);
var processedFolder = DriveApp.getFolderById(SCREENSHOT_PROCESSED_FOLDER_ID);
var files = inputFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
file.moveTo(processedFolder);
}
在 File 或 Folder 类中没有直接方法将文件从 Google Drive 中的一个文件夹移动到另一个文件夹。正如您提到的,您可以复制文件 // newDoc.saveAndClose();
var driveFile = DriveApp.getFileById(newDoc.getId()); // Gets the drive File
driveFile.makeCopy(newDoc.getName(), targetFolder); // Create a copy of the newDoc in the shared folder
driveFile.setTrashed(true); // sets the file in the trash of the user's Drive
编辑:
再考虑一下鲁本的评论。我同意实施阿米特的答案是更好的做法。
var newFileId = newDoc.getId();
var newFile = DriveApp.getFileById(newFileId);
newFile.moveTo(targetFolder);
与之前的方法相比,更安全一点的方法:
如果您先删除文件的链接,那么您将无法添加文件。
如果文件已位于目标文件夹中,则 Amit 提供的方法 (https://stackoverflow.com/a/38810986/11912486) 仅删除文件。
所以,我建议使用以下方法:
function move_file(file_id, target_folder_id) {
var source_file = DriveApp.getFileById(file_id);
var source_folder = source_file.getParents().next();
if (source_folder.getId() != target_folder_id) {
DriveApp.getFolderById(target_folder_id).addFile(source_file);
source_folder.removeFile(source_file);
}
}
可以通过以下方式改进:
javascript 骆驼风格
多个位置验证
该脚本将您的所有个人文件传输到共享磁盘(团队驱动器)。 保存文件夹结构。
DRIVE_FOLDER_ID = '111aaa'; // Folder ID on the shared drive
function start() {
var files = DriveApp.searchFiles('"me" in owners');
while (files.hasNext()) {
var file = files.next();
newPath = fileMoveWithPath(file, DRIVE_FOLDER_ID);
console.info("New path: ", getFullPath(newPath));
}
}
function fileMoveWithPath(file, root) {
var folders = [],
parent = file.getParents();
// Проходим по иерархии папок текущего файла до корня
while (parent.hasNext()) {
parent = parent.next();
folders.push(parent);
parent = parent.getParents();
}
console.info("Old path: ", getFullPath(file));
if (folders.length > 0)
targetPath = makeNewPath(folders, DriveApp.getFolderById(root));
else
targetPath = DriveApp.getFolderById(root);
if (targetPath) {
targetFile = file.moveTo(targetPath);
return targetFile;
};
return;
}
function makeNewPath(folders, newroot) {
var f = folders.pop();
var query = "'" + newroot.getId() + "' in parents and title = '" + f.getName() + "' and mimeType='application/vnd.google-apps.folder' "
var targetFolder = DriveApp.searchFolders(query);
if (targetFolder.hasNext())
targetFolder = targetFolder.next()
else
targetFolder = newroot.createFolder(f.getName());
if (folders.length > 0)
return makeNewPath(folders, targetFolder)
else
return targetFolder;
}
function getFullPath(file) {
var folders = [],
parent = file.getParents();
while (parent.hasNext()) {
parent = parent.next();
folders.push(parent.getName());
parent = parent.getParents();
}
if (folders.length) {
return '> /' + folders.reverse().join("/") + '/' + file.getName();
}
return '> /' + file.getName();
}
试试这个:
var file = DriveApp.getFileById(newDoc.getId());
targetFolder.addFile(file);
//DriveApp.getFolderById('root').removeFile(file); // remove from root
这个问题已得到解答,但这里的配置略有不同:
function moveFile(parameterObject) {
var currentFolderID,file,fileToMoveID,sourceFolder,targetFolder,targetFolderID;
fileToMoveID = parameterObject.fileToMoveID;
currentFolderID = parameterObject.currentFolderID;
targetFolderID = parameterObject.targetFolderID;
file = DriveApp.getFileById(fileToMoveID);//Get the file to move
if (!file) {
functionToHandleThisKindOfThing("there is no file");
return;
}
if (currentFolderID) {//The folder ID holding the current file was passed in
sourceFolder = DriveApp.getFolderById(currentFolderID);
} else {//No ID for the current folder
sourceFolder = file.getParents();
if (sourceFolder) {
if (sourceFolder.hasNext()) {
sourceFolder = sourceFolder.next();
}
}
}
targetFolder = DriveApp.getFolderById(targetFolderID);
targetFolder.addFile(file);
sourceFolder.removeFile(file);
}
function testCode() {
var o;
o = {
'fileToMoveID':"File ID of file to Move",
"targetFolderID":"ID of folder to Move to"
}
moveFile(o);
}