Получите содержимое файла с помощью Google Drive Script Advanced Drive API - Drive.Files.get - или экспортируйте - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужно получить содержимое файла текстового файла с помощью Google Apps Script Advanced Drive Service . Этот вопрос задается c для скрипта Google Apps.

Можно получить содержимое файла, сделав запрос HTTPS с помощью Drive API, но я не хочу делать запрос HTTPS. Итак, я не прошу "обходного пути" или способа, который не использует Advanced Drive Service .

Это возможно получить содержимое файла использование HTTPS-запроса к API Drive REST с использованием собственной ссылки на файл и опции «alt = media». Но я не хочу делать это таким образом, потому что я хочу избежать необходимости для пользователя авторизовать внешний запрос.

Вот способ, которым я делаю это сейчас с Drive REST API.

function getContentsOfTxtFile_(po) {
try{
  var i,options,rtrnObj,selfLink,tkn,url;
  /*
    PASSED IN PARAMETERS
    po.id - the file id of the text file to get
  */

  selfLink = 'https://www.googleapis.com/drive/v3/files/' + po.id;
  url = selfLink + '?alt=media';//using alt=media returns the file content instead of the metadata resource

  tkn = ScriptApp.getOAuthToken();//Get the OAuth token

  options = {};
  options.headers = {Authorization: 'Bearer ' + tkn}
  options.muteHttpExceptions = true;

  for (i=1;i<3;i++) {//Only loop twice because sometimes there will legitimately not be a file
  try{
    rtrnObj = UrlFetchApp.fetch(url,options);//Make an external request to get the file content
    break;//If successful break out of the loop
  } catch(e) {
    if (i!==2) {Utilities.sleep(i*1500);}
    if (i>=2) {
      console.log('ERROR getting file content: ' + e + "Stack: " + e.stack)
    }
  };
  }

  if (!rtrnObj) {
    return false;
  }

  if (rtrnObj.getResponseCode() !== 200) { 
    return false;
  }
  return rtrnObj.getContentText();
}catch(e){
  console.error('Error ' + e)
}
}

Вот что я пробовал:

function getFileContent() {
  try{
    var content = Drive.Files.get('File ID Here',{alt:'media'});
  }catch(e) {
    Logger.log('message: ' + e.message)
  } 

}

Приведенный выше код генерирует ошибку:

сообщение: Код ответа: 200. Сообщение: Содержимое файла здесь

Также можно получить «Ссылку на веб-содержимое» из метаданных файлов, а затем использовать webContentLink для:

Цитата:

Ссылка для скачивания содержимого файла в браузере. Это доступно только для файлов с двоичным содержимым в Google Диске

Документация по адресу: https://developers.google.com/drive/api/v3/reference/files

Я пробовал:

function getFileContentW_Export() {
  try{
    var content = Drive.Files.export('FileID?alt=media','text/plain');
  }catch(e) {
    Logger.log('message: ' + e.message)
  } 

  Logger.log('content: ' + content)
}

ИЛИ:

var content = Drive.Files.export('FileID','text/plain');

Похоже, что Advanced Drive API не может получить содержимое файла. Похоже, что эта возможность была намеренно пропущена в Advanced Drive API, хотя REST API способен получать содержимое файла.

Я выпустил отчет об ошибках в трекере, но отсутствие этой возможности не является считается ошибкой.

https://issuetracker.google.com/issues/149104685

Я бы с удовольствием использовал DriveApp, если бы мог использовать его с прицелом "https://www.googleapis.com/auth/drive.file", но DriveApp.getFileById('ID') не будет работать с этой областью . Следующий код:

var content = DriveApp.getFileById('ID').getAs(MimeType.PLAIN_TEXT).getDataAsString();

Возвращает ошибку:

Исключение: у вас нет разрешения на вызов DriveApp.getFileById. Требуемые разрешения: (https://www.googleapis.com/auth/drive.readonly || https://www.googleapis.com/auth/drive)

Даже область «только для чтения» https://www.googleapis.com/auth/drive.readonly ограничена. См. Раздел «API Gmail и Drive» в разделе по ссылке: https://support.google.com/cloud/answer/9110914#restricted -области

https://developers.google.com/apps-script/reference/drive/drive-app?hl=en#getFileById (строка)

1 Ответ

0 голосов
/ 13 февраля 2020

Я тестировал различные области: диск и drive.file для Files.export() и Files.get()

только drive.file область действия дал мне 404

Почему?

Поскольку drive.file используется для файлов, создаваемых или открываемых приложением

Проверьте это здесь: Аутентификация пользователей

function fileExport(auth) {
  const drive = google.drive({ version: 'v3', auth });
  drive.files.export({
      fileId: fileId,
      mimeType: "text/plain"
    }).then(res => console.log(res))
    .catch(e => console.log(e));
}

для файлов, созданных на диске, используйте:

function fileGet(auth) {
  const drive = google.drive({ version: 'v3', auth });
  drive.files.get({
      fileId: fileId
    }).then(res => console.log(res))
    .catch(e => console.log(e));
}

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...