-1

私はあらゆる種類のスクリプトを作成するのに非常に慣れていないため、Google Apps スクリプトを作成して特定の文字列をフォルダーから検索し、見つかった場合はフォルダーを別のフォルダーに移動しようとしています。

フォルダーをコピーできますが、コピーしたフォルダーは元のフォルダーと同じ ID を持ち、一方を削除すると他方も削除されるため、移動できません。私が把握できたことから、フォルダーから適切な子を削除することでこれを実装できます。API エクスプローラーでこれを試してみましたが、期待どおりの結果が得られました。

問題は、 script.google.comの Google ドライブ SDK ページにある例を実装する方法を一生理解できないことです。サンプル コードを貼り付けると、 の後に Missing name が表示されます。オペレーターエラー。どのスクリプト コマンドでも子を削除できません。

おそらくこれは単純な問題であり、このプロジェクトを実行して JavaScript を学ぼうとしていることが原因ですが、Google Script で移動機能を実装する方法についてのヘルプやアドバイスをいただければ幸いです。

具体的な質問は次のとおりです。フォルダ移動スクリプトを実装するにはどうすればよいですか? これは私が試みていることですが、両方のフォルダーを削除します:

while (contents.hasNext()) {
  folder = contents.next();
  name = folder.getName();
  if (name.search("XYZ") != -1) {
    moveFolder = folder;
    targetFolder.addFolder(moveFolder) moveFolder.setName('DEL_' +
      moveFolder.getName());
    removeFolder(moveFolder);
  }
}
4

1 に答える 1

6

まず、いくつかの混乱を解消しましょう。ドライブに関連する 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);
};
于 2013-09-06T21:18:39.380 に答える