簡體   English   中英

如何使用 Google Apps 腳本在 Google Drive 中移動文件夾

[英]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()最近已被棄用,因此不再像上面的答案所暗示的那樣可用)。


預期結果

我的期望是,當用戶點擊插件中的“關閉”按鈕時,它會將相關文件夾(在插件中的前一階段選擇)從“打開”文件夾移動到“關閉”文件夾(它們在文件夾層次結構中的同一級別彼此相鄰)。 需要明確的是,我希望它會移動文件夾,而不是在目標文件夾中復制它,然后從原始父文件夾中刪除原始文件夾。

實際結果

請參閱下面的具體錯誤消息,但一般來說,當用戶單擊“關閉”按鈕時,我會立即收到錯誤消息,並且文件夾沒有任何反應。


嘗試 1 - Folder.moveTo(destination)

從表面上看 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.

嘗試 2 - Drive.Files.update()

未能解決上述問題,我嘗試了 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 方法,您還可以通過以下方式遷移文件夾

  1. 在共享驅動器中創建文件夾
  2. 將文件移動到創建的文件夾
  3. 遞歸任何子文件夾
  4. 刪除移動的原始文件夾。

提示:如果被遷移的文件夾中的子文件夾應用了多親,您需要在上面的代碼中包含一個檢查以避免創建重復的文件夾。

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM