[英]How to move a folder in Google Drive using Google Apps Script
我在 Google 的問題跟蹤器中記錄了一個關於Folder.moveTo(destination)
function 不起作用的問題,因為它似乎是一個錯誤。 隨意給這個問題加注星標,給它一個沖擊!
https://issuetracker.google.com/issues/163080678
我正在嘗試提供一種“一鍵式”方式,通過插件(同時出現在 Drive 和 Gmail 中)在 Google Drive 中移動文件夾。 對於上下文,在這種情況下,每個“文件夾”都是一個事件,“單擊”會將文件夾(包含與該事件相關的所有文檔)從“打開”文件夾移動到“關閉”文件夾。 但是,我試圖實現這一目標的每一種方式都會遇到令人困惑和無益的錯誤。
注意:所有這些文件夾都在共享團隊雲端硬盤中。 我知道這對 DriveApp 服務和 Drive API 可以做的事情有一些限制,但我所有的手指和腳趾都在交叉,這不僅僅是一個固有的限制,而且有一個解決方法!
我已經閱讀了以下內容:
但他們沒有解決我的問題(注意addFile()
, addFolder()
, removeFile()
和removeFolder()
最近已被棄用,因此不再像上面的答案所暗示的那樣可用)。
我的期望是,當用戶點擊插件中的“關閉”按鈕時,它會將相關文件夾(在插件中的前一階段選擇)從“打開”文件夾移動到“關閉”文件夾(它們在文件夾層次結構中的同一級別彼此相鄰)。 需要明確的是,我希望它會移動文件夾,而不是在目標文件夾中復制它,然后從原始父文件夾中刪除原始文件夾。
請參閱下面的具體錯誤消息,但一般來說,當用戶單擊“關閉”按鈕時,我會立即收到錯誤消息,並且文件夾沒有任何反應。
從表面上看 Google 文檔,我首先嘗試使用Folder.moveTo(destination)
,如下所示:
function moveFolder() {
var folderToMove = DriveApp.getFolderById(MOVE_FOLDER_ID);
var destinationFolder = DriveApp.getFolderById(DESTINATION_FOLDER_ID);
folderToMove.moveTo(destinationFolder);
}
但是,在運行此程序時,我收到錯誤消息: Exception: Unexpected error while getting the method or property moveTo on object DriveApp.Folder.
未能解決上述問題,我嘗試了 Google Apps Script 的Advanced Drive功能,並嘗試使用Drive.Files.update()
( 此處的文檔)。 我的代碼如下所示:
function moveFolder() {
Drive.Files.update({parents: [{id: DESTINATION_FOLDER_ID}]}, MOVE_FOLDER_ID);
}
我還嘗試了一種變體,包括可選參數supportsAllDrives
,如下所示:
function moveFolder() {
Drive.Files.update({supportsAllDrives: true, parents: [{id: DESTINATION_FOLDER_ID}]}, MOVE_FOLDER_ID);
}
但是,兩種變體都給出了錯誤: GoogleJsonResponseException: API call to drive.files.update failed with error: File not found: [fileId]
,其中[fileId]
是被移動文件夾的實際 Google Drive ID。
我已經在嘗試 1 和 2 中確認,通過使用我知道可以工作的各種其他功能(例如使用 Drive.Properties 添加客戶屬性並使用Drive.Properties
重命名文件夾),文件夾本身肯定被正確傳遞並且能夠以編程方式操作。 即,該文件夾肯定存在,並且在瀏覽器中使用 URL 肯定可以使用該驅動器 ID 找到。
您可以 a) 在共享驅動器的新位置創建一個“等效”文件夾,而不是直接移動文件夾,b) 使用 moveTo() 將其文件從 a 移動到新文件夾,以及 c) 在完全遷移后刪除原始文件夾。 這當然會更改文件夾的 ID,但它適用於共享驅動器以及 MyDrive 中應遷移到共享驅動器的文件夾
請注意,這使用了 Advanced Drive Service v2(在 Apps 腳本中啟用):
// function to copy a folder e.g. to a shared drive
function copyFolderToSharedDrive(folderTitle,folderId,targetParentId) {
var optionalArgs={supportsAllDrives: true};
var resource = {
title: folderTitle + '_copy', // adjust according to your needs
mimeType: 'application/vnd.google-apps.folder',
parents:[{
"id": targetParentId, // some folder in a shared drive
}],
description: folderId // optional, to back reference the source Folder
}
var migratedFolder = Drive.Files.insert(resource, null, optionalArgs);
Logger.log(migratedFolder.id);
// Optional: post-process original folder, e.g. trash it
// ...
}
從我的驅動器移動到單親 Model 時的缺點已在我的驅動器中強制執行:您需要檢查子文件夾的多個“添加”以避免創建重復的文件夾。
僅使用 DriveApp 方法,您還可以通過以下方式遷移文件夾
提示:如果被遷移的文件夾中的子文件夾應用了多親,您需要在上面的代碼中包含一個檢查以避免創建重復的文件夾。
// execute this function
function run_me() {
var folderId = 'ID_OF_FOLDER_TO_BE_MIGRATED'; // some folder (located in My Drive or Shared Drive)
var targetParentId = 'ID_OF_TARGET_PARENT_FOLDER'; // a folder in a Shared Drive
var folder = DriveApp.getFolderById(folderId);
var parent = DriveApp.getFolderById(targetParentId);
migrateFolderToSharedDrive(folder,parent); // copy folders and move files
folder.setTrashed(true); // trash original folder
}
// main function (recursive)
function migrateFolderToSharedDrive(folder,parent) {
var copiedFolder = parent.createFolder(folder.getName()).setDescription('previous Id: '+folder.getId());
Logger.log('Folder created with id %s in parent %s',copiedFolder.getId(),parent.getId());
// move files
var files = folder.getFiles();
while (files.hasNext()) {
Logger.log('File with id %s moved to %s', files.next().moveTo(copiedFolder).getId(), copiedFolder.getId())
}
// recurse any subfolders
var childfolders = folder.getFolders();
while (childfolders.hasNext()) {
var child = childfolders.next();
Logger.log('processing subfolder %s',child.getId());
migrateFolderToSharedDrive(child,copiedFolder); // recursive call
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.