3

Я пытаюсь создать документы, используя информацию, размещенную через формы Google, а затем, как только документ будет создан, я хотел бы переместить документ в общую папку для просмотра людьми.Перемещение файлов на Google Диске с использованием Google Script

На данный момент у меня есть сценарий, который берет всю информацию из связанной таблицы Google Forms.

Используя эту информацию, я использую следующий код для создания документа:

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

Это создает документ успешно в моей корневой папке Google Drive, но я не могу показаться, чтобы переместить его, где я хотите переместить его.

Я видел много сообщений, предлагающих использовать такие вещи, как targetFolder.addFile (newDoc), но это не работает, аналогично я видел примеры вроде newDoc.addToFolder (targetFolder), но опять же это не работает меня.

Кажется, что все вопросы онлайн-пользователей, о которых уже спрашивали об этом, используют предыдущие версии API, которые больше не применимы, и эти методы не применяются к новым функциям DriveApp.

Я хотел бы, если возможно, создать новый документ, как указано выше, чтобы я мог редактировать содержимое с помощью сценария, а затем переносить этот файл в общую папку. (Из того, что я понимаю, в настоящее время функция «двигаться» отсутствует, поэтому достаточно скопировать и удалить старый).

ответ

1

Нет прямого метода в 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 

EDIT:

Во второй мысли и принимать с учетом комментариев Рубена. Я согласен с тем, что лучше реализовать ответ Амита.

+0

См. [Ответ] (http://stackoverflow.com/a/38810986/1595451) от Amit. –

+0

Спасибо @ Rubén (: Я думаю, что оба ответа правильны в контексте потребностей пользователя. @Amit прав насчет изменения «id» и «настроек совместного доступа», что важно, когда вы хотите переместить файлы из одной папки в другую и они уже были доступны для некоторых пользователей. В этом случае @S Woodhouse хочет создать файл, изменить его, а затем переместить его, я думаю, что он не заботится о настройках 'id' и' share 'для временного file – ocordova

+0

Лично я хотел бы использовать другой подход, используя Advanced Drive Service для создания окончательного документа и вставки его непосредственно в целевую папку с помощью 'Drive.Files.insert (file)', но это для пользователя решаем (: – ocordova

0

Попробуйте это:

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

Если сделать копию файла и мусор оригинал, это изменит файл URL, а также настройки общего доступа к файлам не будут сохранены.

В Приводе можно использовать add a file to multiple folders с помощью метода .addFolder() службы DriveApp. Вы можете добавить файл в целевую папку, а затем удалить файл из непосредственной родительской папки.

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

Я обнаружил, что мне нужно было перевернуть последние две строки (так что removeFile выполняется сначала), иначе removeFile фактически просто удаляет его из папки, в которой он был просто добавлен и не из исходного родителя. Я пробовал редактировать код, но редактирование было отклонено как «не имеет смысла как редактирование», что не имеет для меня никакого смысла!;) – RedYeti

0

Этот вопрос был дан ответ, но здесь немного другая конфигурация:

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

} 
2

Это мой первый пост! Я знаю, что на это был дан ответ несколько раз, но на самом деле я столкнулся с этим вопросом во время работы над моим проектом, и, просмотрев документацию по скриптам приложений, я понял, что это сделать. Вариант ответа некоторых.

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

Надеюсь, это поможет!