Drive.Files.Copy и "родители" не работают - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь скопировать файл в Team Drives в новую папку, также в Team Drives. В последней строке кода появляется ошибка «Файл не найден». Идентификатор newFileID был проверен с использованием DriveApp.getFileByID и путем тестирования в Google API Try-It.

Я думаю, что часть "родителей" сформирована неправильно. Когда я пытаюсь попробовать Google API Try-It, файл копируется в правильную папку. Ура! Так что не так с кодом Google Script?

https://developers.google.com/drive/api/v3/reference/files/copy#try-it

Код Google Script (не работает):

function test() {

  // find Teacher's Learner Guides folder
  var destinationFolderId = "1qQJhDMlHZixBO9KZkkoSNYdMuqg0vBPU";

  var newFile = {
    "name": "Learner Guide - test",
    "description": "New student learner guide",
    "parents": [destinationFolderId]
  };

  // create duplicate document
  var newFileID = "1g6cjUn1BWVqRAIhrOyXXsTwTmPZ4QW6qGhUAeTHJSUs";
  var newDoc = Drive.Files.copy(newFile, newFileID);

}

Пробный код Google API работает. Вот javascript (рабочий):

return gapi.client.drive.files.copy({
      "fileId": "1g6cjUn1BWVqRAIhrOyXXsTwTmPZ4QW6qGhUAeTHJSUs",
      "supportsTeamDrives": true,
      "resource": {
        "parents": [
          "1qQJhDMlHZixBO9KZkkoSNYdMuqg0vBPU"
        ],
        "name": "Learner Test2"
      }
    })

Каков будет эффективный и / или правильный способ использования Drive.Files.Copy в коде Google Script для помещения скопированного файла в другую папку?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Метаданные parents, связанные с запросом, ожидают ресурс ParentReference для Drive API v2, который является как минимум объектом со свойством id и связанным fileId, например. {id: "some id"}.

Поскольку вы работаете с Team Drives, вы должны сообщить Google, что вы (то есть ваш код) знаете, как обрабатывать связанные различия между обычными и Team Drives с необязательным параметром supportsTeamDrives.

Примечание:

Родитель не появляется в списке родителей, если запрашивающий пользователь не является членом Team Drive и не имеет доступа к родителю. Кроме того, за исключением папки верхнего уровня, список родителей должен содержать ровно один элемент, если файл находится на Team Drive.

Предполагая, что обработчик кода соответствует критериям, самый простой код для копирования данного файла в заданную папку Team Drive:

function duplicate_(newName, sourceId, targetFolderId) {
  if (!newName || !sourceId || !targetFolderId)
    return;
  const options = {
    fields: "id,title,parents", // properties sent back to you from the API
    supportsTeamDrives: true, // needed for Team Drives
  };
  const metadata = {
    title: newName,
    // Team Drives files & folders can have only 1 parent
    parents: [ {id: targetFolderId} ],
    // other possible fields you can supply: 
    // https://developers.google.com/drive/api/v2/reference/files/copy#request-body
  };

  return Drive.Files.copy(metadata, sourceId, options);
}

Дополнительное чтение:

0 голосов
/ 09 сентября 2018

Вот решение для копирования файлов в Team Drives. У @tehhowch была важная часть о необходимости дополнительных параметров (вам нужно использовать все три параметра для копирования API v2). Тогда для аргумента «родители» требуется объект File, а не строка. Приведенный ниже код работает, копируя файл и перемещая его в другую папку Team Drives.

function test() {

  // find Teacher's Learner Guides folder
  var destFolderId = "1qQJhDMlHZixBO9KZkkoSNYdMuqg0vBPU";
  var originalDocID = "1g6cjUn1BWVqRAIhrOyXXsTwTmPZ4QW6qGhUAeTHJSUs";
  var destFolder = Drive.Files.get(destFolderId, {"supportsTeamDrives": true});

  var newFile = {
    "fileId": originalDocID,
    "parents": [
      destFolder // this needed to be an object, not a string
    ]
  };
  var args = {
    "resource": {
      "parents": [
        destFolder // this needed to be an object, not a string
      ],
      "title": "new name of document here"
    },
    "supportsTeamDrives": true
  };

  // create duplicate Learner Guide Template document
  var newTargetDoc = Drive.Files.copy(newFile, originalDocID, args);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...