まず、いくつかの混乱を解消しましょう。ドライブに関連する 2 つの「サービス」が提供されており、Google Apps Script、Drive Services、およびDocslist Services内で使用できます。参照したドキュメントはGoogle Drive SDK 用のものであり、同じものではありません。Google Apps Script でプログラミングしている場合は、SDK ドキュメントを無視してください。
次に、ドライブ上のフォルダまたはファイルとは何か、それが「コピー」、「移動」、「削除」の概念にどのように影響するかについて説明します。ファイルまたはフォルダーは、親としてフォルダーを持つ場合があります。実際には、複数の親を持つ場合があります。同じファイルまたはフォルダーを別のフォルダーに「コピー」したい場合は、それをターゲット フォルダーに子として追加するだけです。この時点で、同じ ID を持つ 2 つのアイテムがあるように見えるかもしれませんが、実際には 2 つの親を持つ 1 つのアイテムがあります。次に、ファイルまたはフォルダーを元のフォルダーから削除すると (ある意味で所有権を放棄します)、1 つの親が残り、これは "移動" のように見えます。ファイルまたはフォルダーは「削除」されていません。一方、親子関係をなくすのではなく、ファイルまたはフォルダーを削除すると、あなたが説明したように、「両方のフォルダーが削除された」ように見えます。
したがって、「移動」スクリプトは新しい親子関係を追加し、もう一方を削除する必要があります。
エディタで新しいスクリプトを開くと表示される Drive スターター スクリプトには、 という関数が含まれていますmoveFileToFolder()
。

この関数は、移動しているものがファイルであることを除いて、探していることを行います。ただし、ファイルに使用されるメソッドにはフォルダーのいとこがあるため、置換を行うだけで次のようになりますmoveFolderToFolder()
。
/**
* This script moves a specific folder into a given folder, and removes the folder
* from all other folders that previously contained it. For more information on
* interacting with files, see
* https://developers.google.com/apps-script/drive/file
*/
function moveFolderToFolder(sourceFolderId, targetFolderId) {
var targetFolder = DriveApp.getFolderById(targetFolderId);
var sourceFolder = DriveApp.getFolderById(sourceFolderId);
var currentFolders = sourceFolder.getParents();
while (currentFolders.hasNext()) {
var currentFolder = currentFolders.next();
currentFolder.removeFolder(sourceFolder);
}
targetFolder.addFolder(sourceFolder);
};
フォルダーNamesgetFoldersByName()
を処理する場合は、 を使用して一致するすべてのフォルダーを収集し、次に を使用next()
してリストを反復処理する必要があります。フォルダー名を使用するようにその関数を変更する方法を次に示します。簡単にするために、指定された名前のフォルダーは 1 つだけであると想定し、そうでない場合は例外をスローします。関心のあるフォルダーのハンドルを取得したら、関数のバランスは前の例と同じままです。
function moveNamedFolderToFolder(sourceFolderName, targetFolderName) {
var matchedFolders = DriveApp.getFoldersByName(sourceFolderName);
if (matchedFolders.hasNext()) {
var sourceFolder = matchedFolders.next();
if (matchedFolders.hasNext()) throw new Error( "Source Folder Name not unique" );
}
matchedFolders= DriveApp.getFoldersByName(targetFolderName);
if (matchedFolders.hasNext()) {
var targetFolder = matchedFolders.next();
if (matchedFolders.hasNext()) throw new Error( "Target Folder Name not unique" );
}
var currentFolders = sourceFolder.getParents();
while (currentFolders.hasNext()) {
var currentFolder = currentFolders.next();
currentFolder.removeFolder(sourceFolder);
}
targetFolder.addFolder(sourceFolder);
};