Мне нужно получить содержимое файла текстового файла с помощью 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 (строка)