web-dev-qa-db-ja.com

Googleスクリプトを使用してGoogleドライブ内のファイルを移動する

Googleフォームから投稿された情報を使用してドキュメントを作成しようとしています。ドキュメントが作成されたら、そのドキュメントを共有フォルダーに移動して、他のユーザーが表示できるようにします。

現時点では、Googleフォームにリンクされたスプレッドシートからすべての情報を取得するスクリプトを用意しています。

その情報を使用して、次のコードを使用してドキュメントを作成しています。

  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var newDoc = DocumentApp.create(requestID + " - " + requestSummary);

これにより、Googleドライブのルートフォルダーにドキュメントが正常に作成されますが、移動先に移動できないようです。

TargetFolder.addFile(newDoc)のようなものを使用することを提案する多くの投稿を見てきましたが、それは機能しません。同様に、newDoc.addToFolder(targetFolder)のような例を見ましたが、これは私にとっては機能しません。

これについて人々がすでに質問したすべてのオンラインの質問は、適用されなくなった以前のAPIバージョンを使用しており、これらのメソッドは新しいDriveApp機能には適用されないようです。

可能であれば、上記のように新しいドキュメントを作成して、スクリプトを使用して内容を編集し、そのファイルを共有フォルダーに移動できるようにします。 (私が理解していることから、現在「移動」機能はないので、コピーを作成して古いものを削除するだけで十分です)。

14
S Woodhouse

ファイルのコピーを作成して元のファイルをゴミ箱に入れると、ファイルのURLが変更され、ファイル共有設定も保持されなくなります。

ドライブでは、DriveAppサービスの.addFolder()メソッドを使用して ファイルを複数のフォルダーに追加 することができます。ファイルをターゲットフォルダーに追加してから、直接の親フォルダーからファイルを削除できます。

function moveFiles(sourceFileId, targetFolderId) {
  var file = DriveApp.getFileById(sourceFileId);
  file.getParents().next().removeFile(file);
  DriveApp.getFolderById(targetFolderId).addFile(file);
}
20
Amit Agarwal

これは私の最初の投稿です!私はこれが何度か回答されたことを知っていますが、実際にプロジェクトで作業しているときにこの質問に遭遇し、Apps Scriptのドキュメントを確認しているときに、簡潔な方法を見つけました。 some1の答えのバリエーション。

var file = DriveApp.getFileById(fileid);
DriveApp.getFolderById(folderid).addFile(file);
DriveApp.getRootFolder().removeFile(file);

それが役に立てば幸い!

11
Aaron McKeehan

File または Folder クラスには、Googleドライブのあるフォルダから別のフォルダにファイルを移動する直接的な方法はありません。あなたが言及したように、メソッド makeCopy() でファイルを別のフォルダーにコピーし、次に setTrashed() でそれを削除できます。コードは次のようになります。

  var targetFolder = DriveApp.getFolderById(TARGET_FOLDER_ID);
  var newDoc = DocumentApp.create(requestID + " - " + requestSummary); // Creates the Document in the user's Drive root folder

  // Modify the new document here, example:
  // var body = newDoc.getBody();
  // body.appendParagraph("A paragraph.");
  // 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

編集:

もう一度考えて、ルーベンのコメントを考慮に入れます。私はアミットの答えを実装することがより良い実践であることに同意します。

2
ocordova

以前のものに比べて少し安全なアプローチ:

  1. 最初にファイルへのリンクを削除すると、addFileを実行できなくなります。

  2. ファイルが既にターゲットフォルダーにある場合、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キャメルスタイル

  • 複数の場所の検証

1
aadral

これを試して:

var file = DriveApp.getFileById(newDoc.getId());
targetFolder.addFile(file);
//DriveApp.getFolderById('root').removeFile(file); // remove from root
0
some1

この質問には回答済みですが、ここでは少し異なる構成です:

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);

}
0
Alan Wells